ViKo 1 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба Вот файл. В нем по прерываниям от USART3 микроконтроллер STM32F207ZC (с другими не пробовал) принимает два байта (от панели управления... не важно). Попробуйте добавить его к любому тестовому проекту с скомпилировать в Keil 4.54. Дефайном заблокирован другой вариант программы, с тем же результатом. На уровнях оптимизации выше 0 мне Windows 7 x64 выдает окошко: Программа "The ARM C/C++ Compiler" не работает ... [Закрыть программу] На уровне оптимизации 0 - компилируется. P.S. Ой-ё! Виноват атрибут __attribute__((bitband)). Без него компилируется. Что же это такое?! Test.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
porex 0 30 ноября, 2012 Опубликовано 30 ноября, 2012 · Жалоба __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. Потому что этот атрибут дает атомарный доступ к биту. Нефиг туда засовывать массив. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 30 ноября, 2012 Опубликовано 30 ноября, 2012 · Жалоба Потому что этот атрибут дает атомарный доступ к биту. Нефиг туда засовывать массив. Что атрибут делает, я знаю. Для того и пишу. А для проверки вашего категоричного утверждения заменил массив на uint8_t RcBuf0; //!< Panel Receive Buffer uint8_t RcBuf1; Результат - тот же. Да и почему, собственно, "нефиг"? И как влияет уровень оптимизации на "нефиг"? Структур, подобных этой, у меня с десяток наберется. Правда, без массивов. Но дело, как видите, не в них. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
porex 0 30 ноября, 2012 Опубликовано 30 ноября, 2012 · Жалоба Не знаю почему у вас не компилируется. У меня все отлично получается и даже работает в контроллере;) #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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 30 ноября, 2012 Опубликовано 30 ноября, 2012 · Жалоба Продолжаю. Если добавить атрибут размещения по нужному адресу, то компилируется. Если нет, то нет. :) #define PAN_INIT {0, 0, 0, 0, 0, 0} // Pan_t PanCtrl = PAN_INIT; // не компилируется Pan_t PanCtrl __attribute__((at(0x20010000))) = PAN_INIT; // компилируется Не знаю почему у вас не компилируется. У меня все отлично получается и даже работает в контроллере;) С двумя байтами для приема попробуйте. У меня не компилируется точно так же, как и с массивом из двух байтов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
porex 0 30 ноября, 2012 Опубликовано 30 ноября, 2012 · Жалоба С двумя байтами для приема попробуйте. У меня не компилируется точно так же, как и с массивом из двух байтов. Да действительно, если обращаться к RcBuf0 и RcBuf1, то не компилит, если только RcBuf0(RcBuf1 определен но его не трогаю), то все нормально. Вообще ИМХО в подобного рода структурах не должно быть обычных переменных, массивов и т.п., только битовые определения. Сделайте вложенную структуру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 30 ноября, 2012 Опубликовано 30 ноября, 2012 · Жалоба Вообще ИМХО в подобного рода структурах не должно быть обычных переменных, массивов и т.п., только битовые определения. У меня все было, и компилировалось, и работало. И структура, описанная в первом сообщении, работала для STM32F103. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
porex 0 30 ноября, 2012 Опубликовано 30 ноября, 2012 · Жалоба Я как раз все это под 103-им и пробовал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 30 ноября, 2012 Опубликовано 30 ноября, 2012 · Жалоба Да, для 103-го то же самое. Помню, было у меня похожее для 151-го. Там компилировалось, но обращалось не туда. Убрал __attribute__((bitband)), и все заработало. Неладно что-то с этим атрибутом! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 · Жалоба Вопрос не по теме : Дайте мне пожалуйста кряк для Keil MDK 4.6 Я только что переехал на windows7 , и тот кряк которым пользовался раньше не запускается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 · Жалоба Вопрос не по теме : Дайте мне пожалуйста кряк для Keil MDK 4.6 Я только что переехал на windows7 , и тот кряк которым пользовался раньше не запускается. http://rutracker.org/forum/viewtopic.php?t=2305709 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 · Жалоба Кто поможет прояснить такую вещь: Это ожидание установки бита 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 В первом случае в симуле бит устанавливается, во втором - нет. Кейлобага? *Проверить в железе сейчас не могу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 · Жалоба MiklPolikov или тут Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 декабря, 2012 Опубликовано 5 декабря, 2012 · Жалоба Вспомнил. Ставил 4.60, но вернулся обратно на 4.54 из-за отсутствия человеческих русских букв. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 5 декабря, 2012 Опубликовано 5 декабря, 2012 · Жалоба Вспомнил. Ставил 4.60, но вернулся обратно на 4.54 из-за отсутствия человеческих русских букв. и это сделано давно :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться