jcxz 192 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба По настоящим адресам и есть обращение. Например: (*((volatile unsigned long *) 0x43D00000)) И не надо ничего выдумывать, такой вариант работает в компиляторах для ARM и для любых других. Опять 25... Я писал не про обращение, а про выделение. Чувствуете разницу? Если разжевать: когда Вы так обратились к какому-то флагу, соответственно - изменился некий байт адреса в области RAM. Вот чтобы этот байт не оказался занятым чем-то полезным, нужно выделить на его месте переменную, в которой и хранится этот флаг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Эта область плавающая? то есть в одном контроллере в разных программах при одной конфигурации проца, может при обращении по адресу 0x43D00000 происходить запись в разные биты? В одни и те-же ФИКСИРОВАННЫЕ адреса основной области памяти. Но в этой основной области памяти именно по этому адресу должна находится именно та 32bit переменная в котрой меняется бит. Оба варианта адресации должны быть взаимоувязанными. Обращение по фиксированому адресу не позволяет этого сделать. Привязывать к фиксированному адресу еще и 32bit переменную не предлагать по причине глупости такого "решения". Адрес бита совершенно естественно и без всяких плясок пересчитывается из назначенного компилятором и линкером адреса в основной области. Постой макрос и все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба чего читать то? Я не понимаю зачем возня и почему нельзя писать напрямую через адрес, ну типа вот так (*((volatile unsigned long *) 0x43D00000)) ? пробил дефайнами нужные биты и сиди ими щелкай, чего я не учитываю? Не учитываете, что когда Вы делаете: *((volatile unsigned long *) 0x43D00000) = 1, то в реальной ОЗУ, соответсвующей этому адресу, меняется этот бит. И где этот бит находится? Куда попадает? Вы всё своё ПО пишете так: *((volatile unsigned long *)addr_XXX = y; или всё-таки выделяете память для переменной и делаете так: int XXX; XXX = y; ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Вот чтобы этот байт не оказался занятым чем-то полезным, нужно выделить на его месте переменную, в которой и хранится этот флаг. Увы, удручающему большинству здесь выступающих, понять эту очевидный факт не по силам :(. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Увы, удручающему большинству здесь выступающих, понять эту очевидный факт не по силам :(. И не говорите..... Такое ощущение, что многие из здесь присутствующих не знают что такое распределение памяти под переменные и для чего нужен линкёр, а пишут весь свой код как: *(int *)0x000XXX = y Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Увы, удручающему большинству здесь выступающих, понять эту очевидный факт не по силам :(. И не говорите..... Такое ощущение, что многие из здесь присутствующих не знают что такое распределение памяти под переменные и для чего нужен линкёр, а пишут весь свой код как: *(int *)0x000XXX = y Нет. Зато есть ощущение, что некоторые из здесь присутствующих выражаются недостаточно чётко, их понимают превратно, а они списывают это на скудоумие аудитории и своё интеллектуальное превосходство. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Погодите-погодите... а зачем регион бит-банда включен в общую оперативную память? А если он не включен, то как линкер там может разместить какие-то переменные? Чего то я реально не понимаю, вот с сайта арма #define BITBAND_SRAM_REF 0x20000000 #define BITBAND_SRAM_BASE 0x22000000 #define BITBAND_SRAM(a,b) ((BITBAND_SRAM_BASE + (a-BITBAND_SRAM_REF)*32 \ + (b*4))) // Convert SRAM address #define BITBAND_PERI_REF 0x40000000 #define BITBAND_PERI_BASE 0x42000000 #define BITBAND_PERI(a,b) ((BITBAND_PERI_BASE + (a-BITBAND_PERI_REF)*32 \ + (b*4))) // Convert PERI address #define MAILBOX 0x20004000 #define TIMER 0x40004000// Mailbox bit 0 #define MBX_B0 *((volatile unsigned int *)(BITBAND_SRAM(MAILBOX,0)))// Mailbox bit 7 #define MBX_B7 *((volatile unsigned int *)(BITBAND_SRAM(MAILBOX,7)))// Timer bit 0 #define TIMER_B0 *((volatile unsigned char *)(BITBAND_PERI(TIMER,0)))// Timer bit 7 #define TIMER_B7 *((volatile unsigned char *)(BITBAND_PERI(TIMER,7))) int main(void){ unsigned int temp = 0; MBX_B0 = 1; // Word write temp = MBX_B7; // Word read TIMER_B0 = temp; // Byte write return TIMER_B7; // Byte read } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 21 октября, 2015 Опубликовано 21 октября, 2015 (изменено) · Жалоба Еще не добрался до проекта. Но обязательно проверю и сообщу. ааа. Понятно. Действительно, аттрибут к typedef неприменим :rolleyes: 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. Так что только дефайном. Изменено 21 октября, 2015 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Погодите-погодите... а зачем регион бит-банда включен в общую оперативную память? А если он не включен, то как линкер там может разместить какие-то переменные? Чего то я реально не понимаю, вот с сайта арма В Cortex есть регион адресного пространства (в котором может находиться физическое ОЗУ), такой особенный регион (назовём его регион_A), что для каждого его бита в другом регионе адресного пространства (назовём его регион_B) существует 32битное слово, при записи в которое некоторых значений, меняется этот бит (это слово является псевдонимом этого бита). Таким образом, чтобы задействовать эту фичу, надо в регионе_A объявить переменную достаточной ёмкости, хранящую набор битовых флагов, а работать с этими флагами надо через слова-алиасы для этих битов из региона_B. Хотя в то же время эти же биты можно читать/модифицировать и через регион_A. Но если делать запись их через алиасы, то эти записи атомарны, в этом и кроется вся соль bit-banding-а. scifi, если и это описание ещё недостаточно чёткое, то я уже не знаю как ещё объяснить. И всё это можно прочиать в документации на ядро Cortex, к которой я отсылал ещё вначале. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Погодите-погодите... а зачем регион бит-банда включен в общую оперативную память? А если он не включен, то как линкер там может разместить какие-то переменные? Чего то я реально не понимаю, вот с сайта арма #define MAILBOX 0x20004000 Теперь включаем наконец мозг, пробуем читать написанное и думаем что-же за адрес такой "0x20004000" и с чего-бы это вдруг линкеру не разместить там все, что угодно на свое усмотрение? Заодно следует подумать c какого бодуна вывалили такой дивного уродства пример работы с исключительно фиксированным адресом :(. Для демонстрации работы могли-бы хоть что-то такое накропать: 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; Ну а за такие комментарии: #define MBX_B0 *((volatile unsigned int *)(BITBAND_SRAM(MAILBOX,0)))// Mailbox bit 7 .... MBX_B0 = 1; // Word write говнокодерам сляпавшим сей "пример" отдельное спасибо :) :) :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба (назовём его регион_A), что для каждого его бита в другом регионе адресного пространства (назовём его регион_B) все я понял... битбанд для области реальной памяти, я все никак не мог понять что вы с линкером договариваетесь об области реальной памяти, а не об регионе битбанда :) на самом деле не сразу понятно.... теперь я понял почему регион у ТС битмапом завется:)))) говнокодерам сляпавшим сей "пример" отдельное спасибо Когда у человека все вокруг дибилы, ему стоит подумать о своей роли. Ваш статус снижен со среднеуважаемого до малоуважаемого. На форуме есть люди которые иногда или всегда хамят, но иногда они профессионалы своего дела, и иногда стоит потерпеть чтобы узнать что-то ценное. Вы же малоуважаемый zltigo - хамло без выхлопа. Ваши сообщения - это шум, который раздражает и мешает. Пример я взял с официального сайта арма, он строгий, четкий и понятный, а вы идите лесом! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Пример я взял с официального сайта арма, он строгий, четкий и понятный... :) если бы не было так :( и за Вас и ОСОБЕННО за сайт ARM такое дерьмо размещающий :( в качестве "примеров". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Golikov A. отправлен в read only за плохое поведение на неделю. Остальным предлагаю задуматься. Модератор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
copov 3 22 октября, 2015 Опубликовано 22 октября, 2015 · Жалоба Область bit-band и так лежит вне области ОЗУ для данных, поэтому для нее ничего не надо специально резервировать, если обращаться туда по абсолютным адресам. С какого компоновщик будет туда размещать переменные. Обидели Голикова, чуть ли не единственно грамотного человека в этой ветке и радуются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryM 0 22 октября, 2015 Опубликовано 22 октября, 2015 · Жалоба Область bit-band и так лежит вне области ОЗУ для данных Это с чего это? Внимательнее читайте про Bit-banding. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться