Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil. Я попал в багу :)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > Keil
ViKo
Вот файл. В нем по прерываниям от USART3 микроконтроллер STM32F207ZC (с другими не пробовал) принимает два байта (от панели управления... не важно). Попробуйте добавить его к любому тестовому проекту с скомпилировать в Keil 4.54. Дефайном заблокирован другой вариант программы, с тем же результатом.
На уровнях оптимизации выше 0 мне Windows 7 x64 выдает окошко:

Программа "The ARM C/C++ Compiler" не
работает
...
[Закрыть программу]

На уровне оптимизации 0 - компилируется.

P.S. Ой-ё! Виноват атрибут __attribute__((bitband)). Без него компилируется. Что же это такое?!
PoReX
Цитата
__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
Цитата(PoReX @ Nov 30 2012, 08:46) *
Потому что этот атрибут дает атомарный доступ к биту. Нефиг туда засовывать массив.

Что атрибут делает, я знаю. Для того и пишу.
А для проверки вашего категоричного утверждения заменил массив на
uint8_t RcBuf0; //!< Panel Receive Buffer
uint8_t RcBuf1;
Результат - тот же. Да и почему, собственно, "нефиг"? И как влияет уровень оптимизации на "нефиг"?
Структур, подобных этой, у меня с десяток наберется. Правда, без массивов. Но дело, как видите, не в них.
PoReX
Не знаю почему у вас не компилируется. У меня все отлично получается и даже работает в контроллереwink.gif
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
}
ViKo
Продолжаю. Если добавить атрибут размещения по нужному адресу, то компилируется. Если нет, то нет. sm.gif
Код
#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) *
Не знаю почему у вас не компилируется. У меня все отлично получается и даже работает в контроллереwink.gif

С двумя байтами для приема попробуйте. У меня не компилируется точно так же, как и с массивом из двух байтов.
PoReX
Цитата(ViKo @ Nov 30 2012, 13:20) *
С двумя байтами для приема попробуйте. У меня не компилируется точно так же, как и с массивом из двух байтов.

Да действительно, если обращаться к RcBuf0 и RcBuf1, то не компилит, если только RcBuf0(RcBuf1 определен но его не трогаю), то все нормально. Вообще ИМХО в подобного рода структурах не должно быть обычных переменных, массивов и т.п., только битовые определения. Сделайте вложенную структуру.
ViKo
Цитата(PoReX @ Nov 30 2012, 12:32) *
Вообще ИМХО в подобного рода структурах не должно быть обычных переменных, массивов и т.п., только битовые определения.

У меня все было, и компилировалось, и работало. И структура, описанная в первом сообщении, работала для STM32F103.
PoReX
Я как раз все это под 103-им и пробовал.
ViKo
Да, для 103-го то же самое. Помню, было у меня похожее для 151-го. Там компилировалось, но обращалось не туда. Убрал __attribute__((bitband)), и все заработало.
Неладно что-то с этим атрибутом!
MiklPolikov
Вопрос не по теме :
Дайте мне пожалуйста кряк для Keil MDK 4.6
Я только что переехал на windows7 , и тот кряк которым пользовался раньше не запускается.
toweroff
Цитата(MiklPolikov @ Dec 5 2012, 09:55) *
Вопрос не по теме :
Дайте мне пожалуйста кряк для Keil MDK 4.6
Я только что переехал на windows7 , и тот кряк которым пользовался раньше не запускается.

http://rutracker.org/forum/viewtopic.php?t=2305709
_Pasha
Кто поможет прояснить такую вещь:
Это ожидание установки бита 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
MiklPolikov
или тут
ViKo
Вспомнил. Ставил 4.60, но вернулся обратно на 4.54 из-за отсутствия человеческих русских букв.
toweroff
Цитата(ViKo @ Dec 5 2012, 17:44) *
Вспомнил. Ставил 4.60, но вернулся обратно на 4.54 из-за отсутствия человеческих русских букв.

и это сделано давно sm.gif
ViKo
Цитата(toweroff @ Dec 5 2012, 17:52) *
и это сделано давно sm.gif

Где что скачать? Если для шрифта Courier, то не надо. sm.gif Хочу для Consolas.
toweroff
Цитата(ViKo @ Dec 5 2012, 20:28) *
Где что скачать? Если для шрифта Courier, то не надо. sm.gif Хочу для Consolas.

Ну тогда Ваши руки да Вам бы в помощь sm.gif
серьезно - не хотят кейловцы локаль делать нормально..
Victor®
Цитата(ViKo @ Dec 5 2012, 20:28) *
Где что скачать? Если для шрифта Courier, то не надо. sm.gif Хочу для Consolas.


bb-offtopic.gif
Если нравится с перечеркнутым 0
посмотрите на фонт ProfontWindows
http://www.fontspace.com/carl-osterwald/profontwindows
ViKo
Цитата(Victor® @ Dec 5 2012, 23:17) *
Если нравится с перечеркнутым 0
посмотрите на фонт ProfontWindows

Наверное, технологию ClearType это шрифт тоже не поддерживает (как и Courier).

Цитата(toweroff @ Dec 5 2012, 22:57) *
Ну тогда Ваши руки да Вам бы в помощь sm.gif
серьезно - не хотят кейловцы локаль делать нормально..

Понять бы, как сделать...
А бабла кейловцы хотят за свой продукт? sm.gif
Allregia
По ходу вопрос - я работаю в Кейле 4.23, вроде глюков нет. Основные процы - LPC1769, STM32F100, STM32F103, STM32F407.
Есть ли смысл переходить на 4.5х или 4.6 ?
VAI
Цитата(ViKo @ Dec 5 2012, 20:28) *
Где что скачать? Если для шрифта Courier, то не надо. sm.gif Хочу для Consolas.

тогда тут

Цитата(ViKo)
А бабла кейловцы хотят за свой продукт?

Недавно отдали около 360 000руб за годовую лицензию + Ulink Pro бесплатно.... :-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.