|
Keil. Я попал в багу :) |
|
|
|
Nov 29 2012, 13:46
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Вот файл. В нем по прерываниям от USART3 микроконтроллер STM32F207ZC (с другими не пробовал) принимает два байта (от панели управления... не важно). Попробуйте добавить его к любому тестовому проекту с скомпилировать в Keil 4.54. Дефайном заблокирован другой вариант программы, с тем же результатом. На уровнях оптимизации выше 0 мне Windows 7 x64 выдает окошко: Программа "The ARM C/C++ Compiler" не работает ... [Закрыть программу] На уровне оптимизации 0 - компилируется. P.S. Ой-ё! Виноват атрибут __attribute__((bitband)). Без него компилируется. Что же это такое?!
Прикрепленные файлы
Test.zip ( 881 байт )
Кол-во скачиваний: 17
|
|
|
|
|
Nov 30 2012, 05:46
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Цитата __attribute__((bitband)) is a type attribute that gives you efficient atomic access to single-bit values in SRAM and Peripheral regions of the memory architecture. It is possible to set or clear a single bit directly with a single memory access in certain memory regions, rather than having to use the traditional read, modify, write approach. It is also possible to read a single bit directly rather than having to use the traditional read then shift and mask operation. Потому что этот атрибут дает атомарный доступ к биту. Нефиг туда засовывать массив.
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
Nov 30 2012, 07:17
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(PoReX @ Nov 30 2012, 08:46)  Потому что этот атрибут дает атомарный доступ к биту. Нефиг туда засовывать массив. Что атрибут делает, я знаю. Для того и пишу. А для проверки вашего категоричного утверждения заменил массив на uint8_t RcBuf0; //!< Panel Receive Buffer uint8_t RcBuf1; Результат - тот же. Да и почему, собственно, "нефиг"? И как влияет уровень оптимизации на "нефиг"? Структур, подобных этой, у меня с десяток наберется. Правда, без массивов. Но дело, как видите, не в них.
|
|
|
|
|
Nov 30 2012, 09:15
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Не знаю почему у вас не компилируется. У меня все отлично получается и даже работает в контроллере  CODE #include <stdint.h> #include "stm32f10x.h"
/* Тип - Структура интерфейса Панели Управления */ typedef struct { int First : 1; //!< Panel Message First Byte int Ready : 1; //!< Panel Message Ready int dummy1 : 6; uint8_t TxBuf; //!< Panel Transmit Buffer uint8_t RcBuf; //!< Panel Receive Buffer } Pan_t __attribute__((bitband));
/* Структура интерфейса Панели управления */ //#define PAN_INIT {0, 0, 0, 0, 0, 0} Pan_t PanCtrl;// = PAN_INIT; // Front Panel Interface void Handler(void);
/*! ******************************************************************************* * @brief USART3 Receive IRQ Handler * @details Обработчик прерывания от панели управления по USART3 * @param none * @return * @note LSB передается первым */
void Handler(void) { uint8_t tmp = (uint8_t)USART3->DR; // временное хранение принятого байта if (PanCtrl.First) { PanCtrl.RcBuf/*[1]*/ = tmp; PanCtrl.Ready = 1; PanCtrl.First = 0; } else { if (tmp < 32) { PanCtrl.RcBuf/*[0]*/ = tmp; PanCtrl.First = 1; PanCtrl.Ready = 0; } } #ifdef COMPILE /*if (!PanCtrl.First) { // если нет первого байта сообщения if (tmp > 31) return; // номер кнопки больше допустимого PanCtrl.RcBuf[0] = tmp; // записать первый байт PanCtrl.First = 1; // первый байт принят PanCtrl.Ready = 0; // на всякий случай "не готово" } else { // есть первый байт сообщения PanCtrl.RcBuf[1] = tmp; // записать второй байт PanCtrl.First = 0; // ждать первого байта следующей команды PanCtrl.Ready = 1; // сообщение принято - готово }*/ #endif }
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
Nov 30 2012, 09:20
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Продолжаю. Если добавить атрибут размещения по нужному адресу, то компилируется. Если нет, то нет.  Код #define PAN_INIT {0, 0, 0, 0, 0, 0} // Pan_t PanCtrl = PAN_INIT; // не компилируется Pan_t PanCtrl __attribute__((at(0x20010000))) = PAN_INIT; // компилируется Цитата(PoReX @ Nov 30 2012, 12:15)  Не знаю почему у вас не компилируется. У меня все отлично получается и даже работает в контроллере  С двумя байтами для приема попробуйте. У меня не компилируется точно так же, как и с массивом из двух байтов.
|
|
|
|
|
Nov 30 2012, 09:32
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Цитата(ViKo @ Nov 30 2012, 13:20)  С двумя байтами для приема попробуйте. У меня не компилируется точно так же, как и с массивом из двух байтов. Да действительно, если обращаться к RcBuf0 и RcBuf1, то не компилит, если только RcBuf0(RcBuf1 определен но его не трогаю), то все нормально. Вообще ИМХО в подобного рода структурах не должно быть обычных переменных, массивов и т.п., только битовые определения. Сделайте вложенную структуру.
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
Nov 30 2012, 10:06
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Я как раз все это под 103-им и пробовал.
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
Dec 5 2012, 08:42
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Кто поможет прояснить такую вещь: Это ожидание установки бита HSE_RDY в RCC_CR Код 0x08000180 6801 LDR r1,[r0,#0x00] 0x08000182 0389 LSLS r1,r1,#14 0x08000184 D5FC BPL 0x08000180 Это - то же самое, но с байтовым доступом, который по мануалу не запрещен и в эррате не упомянут. CD00171190 p.96 Цитата Access: no wait state, word, half-word and byte access Код 0x08000180 7881 LDRB r1,[r0,#0x02] 0x08000182 0789 LSLS r1,r1,#30 0x08000184 D5FC BPL 0x08000180 В первом случае в симуле бит устанавливается, во втором - нет. Кейлобага? *Проверить в железе сейчас не могу.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|