|
|
  |
реализация булевых переменных в bit-band, кто до чего дошел |
|
|
|
Oct 21 2015, 10:06
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(copov @ Oct 21 2015, 13:50)  По настоящим адресам и есть обращение. Например: (*((volatile unsigned long *) 0x43D00000)) И не надо ничего выдумывать, такой вариант работает в компиляторах для ARM и для любых других. Опять 25... Я писал не про обращение, а про выделение. Чувствуете разницу? Если разжевать: когда Вы так обратились к какому-то флагу, соответственно - изменился некий байт адреса в области RAM. Вот чтобы этот байт не оказался занятым чем-то полезным, нужно выделить на его месте переменную, в которой и хранится этот флаг.
|
|
|
|
|
Oct 21 2015, 10:11
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Golikov A. @ Oct 21 2015, 14:20)  чего читать то? Я не понимаю зачем возня и почему нельзя писать напрямую через адрес, ну типа вот так (*((volatile unsigned long *) 0x43D00000)) ? пробил дефайнами нужные биты и сиди ими щелкай, чего я не учитываю? Не учитываете, что когда Вы делаете: *((volatile unsigned long *) 0x43D00000) = 1, то в реальной ОЗУ, соответсвующей этому адресу, меняется этот бит. И где этот бит находится? Куда попадает? Вы всё своё ПО пишете так: *((volatile unsigned long *)addr_XXX = y; или всё-таки выделяете память для переменной и делаете так: int XXX; XXX = y; ?
|
|
|
|
|
Oct 21 2015, 10:20
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zltigo @ Oct 21 2015, 13:12)  Увы, удручающему большинству здесь выступающих, понять эту очевидный факт не по силам  . Цитата(jcxz @ Oct 21 2015, 13:16)  И не говорите..... Такое ощущение, что многие из здесь присутствующих не знают что такое распределение памяти под переменные и для чего нужен линкёр, а пишут весь свой код как: *(int *)0x000XXX = y Нет. Зато есть ощущение, что некоторые из здесь присутствующих выражаются недостаточно чётко, их понимают превратно, а они списывают это на скудоумие аудитории и своё интеллектуальное превосходство.
|
|
|
|
|
Oct 21 2015, 12:03
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(_Pasha @ Oct 21 2015, 12:47)  Еще не добрался до проекта. Но обязательно проверю и сообщу. ааа. Понятно. Действительно, аттрибут к typedef неприменим Код gcc -Wall -c "tst.c" -I. --std=gnu99 tst.c:18:61: error: section attribute not allowed for ‘bit’ typedef volatile uint32_t __attribute__((section(".bss"))) bit; ^ Compilation failed. Так что только дефайном.
Сообщение отредактировал _Pasha - Oct 21 2015, 12:04
|
|
|
|
|
Oct 21 2015, 12:05
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Golikov A. @ Oct 21 2015, 16:50)  Погодите-погодите... а зачем регион бит-банда включен в общую оперативную память? А если он не включен, то как линкер там может разместить какие-то переменные? Чего то я реально не понимаю, вот с сайта арма В Cortex есть регион адресного пространства (в котором может находиться физическое ОЗУ), такой особенный регион (назовём его регион_A), что для каждого его бита в другом регионе адресного пространства (назовём его регион_B) существует 32битное слово, при записи в которое некоторых значений, меняется этот бит (это слово является псевдонимом этого бита). Таким образом, чтобы задействовать эту фичу, надо в регионе_A объявить переменную достаточной ёмкости, хранящую набор битовых флагов, а работать с этими флагами надо через слова-алиасы для этих битов из региона_B. Хотя в то же время эти же биты можно читать/модифицировать и через регион_A. Но если делать запись их через алиасы, то эти записи атомарны, в этом и кроется вся соль bit-banding-а. scifi, если и это описание ещё недостаточно чёткое, то я уже не знаю как ещё объяснить. И всё это можно прочиать в документации на ядро Cortex, к которой я отсылал ещё вначале.
|
|
|
|
|
Oct 21 2015, 12:58
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Golikov A. @ Oct 21 2015, 13:50)  Погодите-погодите... а зачем регион бит-банда включен в общую оперативную память? А если он не включен, то как линкер там может разместить какие-то переменные? Чего то я реально не понимаю, вот с сайта арма CODE #define MAILBOX 0x20004000 Теперь включаем наконец мозг, пробуем читать написанное и думаем что-же за адрес такой "0x20004000" и с чего-бы это вдруг линкеру не разместить там все, что угодно на свое усмотрение? Заодно следует подумать c какого бодуна вывалили такой дивного уродства пример работы с исключительно фиксированным адресом  . Для демонстрации работы могли-бы хоть что-то такое накропать: CODE unsigned int mailbox;
#define BITBAND_SRAM_REF (0x20000000) #define BITBAND_SRAM_BASE (0x22000000) #define MBX( bit ) \ *(unsigned int *)( (BITBAND_SRAM_BASE) + ( (unsigned int)&mailbox - (BITBAND_SRAM_REF) ) * 32 + ((bit) * 4) )
MBX(0) = TRUE; Ну а за такие комментарии: CODE #define MBX_B0 *((volatile unsigned int *)(BITBAND_SRAM(MAILBOX,0)))// Mailbox bit 7 .... MBX_B0 = 1; // Word write говнокодерам сляпавшим сей "пример" отдельное спасибо
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 21 2015, 13:09
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата (назовём его регион_A), что для каждого его бита в другом регионе адресного пространства (назовём его регион_B) все я понял... битбанд для области реальной памяти, я все никак не мог понять что вы с линкером договариваетесь об области реальной памяти, а не об регионе битбанда  на самом деле не сразу понятно.... теперь я понял почему регион у ТС битмапом завется  ))) Цитата говнокодерам сляпавшим сей "пример" отдельное спасибо Когда у человека все вокруг дибилы, ему стоит подумать о своей роли. Ваш статус снижен со среднеуважаемого до малоуважаемого. На форуме есть люди которые иногда или всегда хамят, но иногда они профессионалы своего дела, и иногда стоит потерпеть чтобы узнать что-то ценное. Вы же малоуважаемый zltigo - хамло без выхлопа. Ваши сообщения - это шум, который раздражает и мешает. Пример я взял с официального сайта арма, он строгий, четкий и понятный, а вы идите лесом!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|