реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> реализация булевых переменных в bit-band, кто до чего дошел
jcxz
сообщение Oct 21 2015, 10:06
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(copov @ Oct 21 2015, 13:50) *
По настоящим адресам и есть обращение. Например:
(*((volatile unsigned long *) 0x43D00000))
И не надо ничего выдумывать, такой вариант работает в компиляторах для ARM и для любых других.

Опять 25... Я писал не про обращение, а про выделение. Чувствуете разницу?
Если разжевать: когда Вы так обратились к какому-то флагу, соответственно - изменился некий байт адреса в области RAM.
Вот чтобы этот байт не оказался занятым чем-то полезным, нужно выделить на его месте переменную, в которой и хранится этот флаг.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 21 2015, 10:09
Сообщение #32


Гуру
******

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



QUOTE (Golikov A. @ Oct 21 2015, 12:30) *
Эта область плавающая?
то есть в одном контроллере в разных программах при одной конфигурации проца, может при обращении по адресу 0x43D00000 происходить запись в разные биты?

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






--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 21 2015, 10:11
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 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; ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 21 2015, 10:12
Сообщение #34


Гуру
******

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



QUOTE (jcxz @ Oct 21 2015, 13:06) *
Вот чтобы этот байт не оказался занятым чем-то полезным, нужно выделить на его месте переменную, в которой и хранится этот флаг.

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



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 21 2015, 10:16
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(zltigo @ Oct 21 2015, 16:12) *
Увы, удручающему большинству здесь выступающих, понять эту очевидный факт не по силам sad.gif.

И не говорите.....
Такое ощущение, что многие из здесь присутствующих не знают что такое распределение памяти под переменные и для чего нужен линкёр, а пишут весь свой код как: *(int *)0x000XXX = y
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 21 2015, 10:20
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zltigo @ Oct 21 2015, 13:12) *
Увы, удручающему большинству здесь выступающих, понять эту очевидный факт не по силам sad.gif.

Цитата(jcxz @ Oct 21 2015, 13:16) *
И не говорите.....
Такое ощущение, что многие из здесь присутствующих не знают что такое распределение памяти под переменные и для чего нужен линкёр, а пишут весь свой код как: *(int *)0x000XXX = y

Нет. Зато есть ощущение, что некоторые из здесь присутствующих выражаются недостаточно чётко, их понимают превратно, а они списывают это на скудоумие аудитории и своё интеллектуальное превосходство.
lol.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 21 2015, 10:50
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

Код
#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
}


Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 21 2015, 12:03
Сообщение #38


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(_Pasha @ Oct 21 2015, 12:47) *
Еще не добрался до проекта.
Но обязательно проверю и сообщу.

ааа. Понятно. Действительно, аттрибут к typedef неприменим rolleyes.gif
Код
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
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 21 2015, 12:05
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 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, к которой я отсылал ещё вначале.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 21 2015, 12:58
Сообщение #40


Гуру
******

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



QUOTE (Golikov A. @ Oct 21 2015, 13:50) *
Погодите-погодите... а зачем регион бит-банда включен в общую оперативную память? А если он не включен, то как линкер там может разместить какие-то переменные? Чего то я реально не понимаю, вот с сайта арма

CODE
#define MAILBOX 0x20004000

Теперь включаем наконец мозг, пробуем читать написанное и думаем что-же за адрес такой "0x20004000" и с чего-бы это вдруг линкеру не разместить там все, что угодно на свое усмотрение? Заодно следует подумать c какого бодуна вывалили такой дивного уродства пример работы с исключительно фиксированным адресом sad.gif.
Для демонстрации работы могли-бы хоть что-то такое накропать:
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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 21 2015, 13:09
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

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



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

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

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

Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 21 2015, 13:11
Сообщение #42


Гуру
******

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



QUOTE (Golikov A. @ Oct 21 2015, 16:09) *
Пример я взял с официального сайта арма, он строгий, четкий и понятный...

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Oct 21 2015, 18:23
Сообщение #43


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Golikov A. отправлен в read only за плохое поведение на неделю.
Остальным предлагаю задуматься.
Модератор
Go to the top of the page
 
+Quote Post
copov
сообщение Oct 22 2015, 07:05
Сообщение #44


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 2-03-05
Из: Санкт-Петербург
Пользователь №: 3 012



Область bit-band и так лежит вне области ОЗУ для данных, поэтому для нее ничего не надо специально резервировать, если обращаться туда по абсолютным адресам. С какого компоновщик будет туда размещать переменные.
Обидели Голикова, чуть ли не единственно грамотного человека в этой ветке и радуются.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Oct 22 2015, 08:11
Сообщение #45


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(copov @ Oct 22 2015, 10:05) *
Область bit-band и так лежит вне области ОЗУ для данных


Это с чего это? Внимательнее читайте про Bit-banding.
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 10:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.02246 секунд с 7
ELECTRONIX ©2004-2016