Перейти к содержанию
    

реализация булевых переменных в bit-band

По настоящим адресам и есть обращение. Например:

(*((volatile unsigned long *) 0x43D00000))

И не надо ничего выдумывать, такой вариант работает в компиляторах для ARM и для любых других.

Опять 25... Я писал не про обращение, а про выделение. Чувствуете разницу?

Если разжевать: когда Вы так обратились к какому-то флагу, соответственно - изменился некий байт адреса в области RAM.

Вот чтобы этот байт не оказался занятым чем-то полезным, нужно выделить на его месте переменную, в которой и хранится этот флаг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эта область плавающая?

то есть в одном контроллере в разных программах при одной конфигурации проца, может при обращении по адресу 0x43D00000 происходить запись в разные биты?

В одни и те-же ФИКСИРОВАННЫЕ адреса основной области памяти. Но в этой основной области памяти именно по этому адресу должна находится именно та 32bit переменная в котрой меняется бит. Оба варианта адресации должны быть взаимоувязанными. Обращение по фиксированому адресу не позволяет этого сделать. Привязывать к фиксированному адресу еще и 32bit переменную не предлагать по причине глупости такого "решения". Адрес бита совершенно естественно и без всяких плясок пересчитывается из назначенного компилятором и линкером адреса в основной области. Постой макрос и все.

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чего читать то? Я не понимаю зачем возня и почему нельзя писать напрямую через адрес, ну типа вот так (*((volatile unsigned long *) 0x43D00000)) ?

пробил дефайнами нужные биты и сиди ими щелкай, чего я не учитываю?

Не учитываете, что когда Вы делаете: *((volatile unsigned long *) 0x43D00000) = 1, то в реальной ОЗУ, соответсвующей этому адресу, меняется этот бит.

И где этот бит находится? Куда попадает?

Вы всё своё ПО пишете так: *((volatile unsigned long *)addr_XXX = y;

или всё-таки выделяете память для переменной и делаете так: int XXX; XXX = y; ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот чтобы этот байт не оказался занятым чем-то полезным, нужно выделить на его месте переменную, в которой и хранится этот флаг.

Увы, удручающему большинству здесь выступающих, понять эту очевидный факт не по силам :(.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Увы, удручающему большинству здесь выступающих, понять эту очевидный факт не по силам :(.

И не говорите.....

Такое ощущение, что многие из здесь присутствующих не знают что такое распределение памяти под переменные и для чего нужен линкёр, а пишут весь свой код как: *(int *)0x000XXX = y

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Увы, удручающему большинству здесь выступающих, понять эту очевидный факт не по силам :(.

И не говорите.....

Такое ощущение, что многие из здесь присутствующих не знают что такое распределение памяти под переменные и для чего нужен линкёр, а пишут весь свой код как: *(int *)0x000XXX = y

Нет. Зато есть ощущение, что некоторые из здесь присутствующих выражаются недостаточно чётко, их понимают превратно, а они списывают это на скудоумие аудитории и своё интеллектуальное превосходство.

:lol:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Погодите-погодите... а зачем регион бит-банда включен в общую оперативную память? А если он не включен, то как линкер там может разместить какие-то переменные? Чего то я реально не понимаю, вот с сайта арма

 

#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
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще не добрался до проекта.

Но обязательно проверю и сообщу.

ааа. Понятно. Действительно, аттрибут к 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.

Так что только дефайном.

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Погодите-погодите... а зачем регион бит-банда включен в общую оперативную память? А если он не включен, то как линкер там может разместить какие-то переменные? Чего то я реально не понимаю, вот с сайта арма

В Cortex есть регион адресного пространства (в котором может находиться физическое ОЗУ), такой особенный регион (назовём его регион_A), что для каждого его бита в другом регионе адресного пространства (назовём его регион_B) существует 32битное слово, при записи в которое некоторых значений, меняется этот бит (это слово является псевдонимом этого бита).

Таким образом, чтобы задействовать эту фичу, надо в регионе_A объявить переменную достаточной ёмкости, хранящую набор битовых флагов, а работать с этими флагами надо через слова-алиасы для этих битов из региона_B. Хотя в то же время эти же биты можно читать/модифицировать и через регион_A. Но если делать запись их через алиасы, то эти записи атомарны, в этом и кроется вся соль bit-banding-а.

 

scifi, если и это описание ещё недостаточно чёткое, то я уже не знаю как ещё объяснить. И всё это можно прочиать в документации на ядро Cortex, к которой я отсылал ещё вначале.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Погодите-погодите... а зачем регион бит-банда включен в общую оперативную память? А если он не включен, то как линкер там может разместить какие-то переменные? Чего то я реально не понимаю, вот с сайта арма

 

#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

говнокодерам сляпавшим сей "пример" отдельное спасибо :) :) :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

(назовём его регион_A), что для каждого его бита в другом регионе адресного пространства (назовём его регион_B)

все я понял... битбанд для области реальной памяти, я все никак не мог понять что вы с линкером договариваетесь об области реальной памяти, а не об регионе битбанда :)

 

на самом деле не сразу понятно.... теперь я понял почему регион у ТС битмапом завется:))))

 

 

 

говнокодерам сляпавшим сей "пример" отдельное спасибо

Когда у человека все вокруг дибилы, ему стоит подумать о своей роли. Ваш статус снижен со среднеуважаемого до малоуважаемого. На форуме есть люди которые иногда или всегда хамят, но иногда они профессионалы своего дела, и иногда стоит потерпеть чтобы узнать что-то ценное. Вы же малоуважаемый zltigo - хамло без выхлопа. Ваши сообщения - это шум, который раздражает и мешает.

 

Пример я взял с официального сайта арма, он строгий, четкий и понятный, а вы идите лесом!

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример я взял с официального сайта арма, он строгий, четкий и понятный...

:) если бы не было так :( и за Вас и ОСОБЕННО за сайт ARM такое дерьмо размещающий :( в качестве "примеров".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Golikov A. отправлен в read only за плохое поведение на неделю.

Остальным предлагаю задуматься.

Модератор

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Область bit-band и так лежит вне области ОЗУ для данных, поэтому для нее ничего не надо специально резервировать, если обращаться туда по абсолютным адресам. С какого компоновщик будет туда размещать переменные.

Обидели Голикова, чуть ли не единственно грамотного человека в этой ветке и радуются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Область bit-band и так лежит вне области ОЗУ для данных

 

Это с чего это? Внимательнее читайте про Bit-banding.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...