Jump to content

    

Keil. Я попал в багу :)

Вот файл. В нем по прерываниям от USART3 микроконтроллер STM32F207ZC (с другими не пробовал) принимает два байта (от панели управления... не важно). Попробуйте добавить его к любому тестовому проекту с скомпилировать в Keil 4.54. Дефайном заблокирован другой вариант программы, с тем же результатом.

На уровнях оптимизации выше 0 мне Windows 7 x64 выдает окошко:

 

Программа "The ARM C/C++ Compiler" не

работает

...

[Закрыть программу]

 

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

 

P.S. Ой-ё! Виноват атрибут __attribute__((bitband)). Без него компилируется. Что же это такое?!

Test.zip

Share this post


Link to post
Share on other sites
__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.

Потому что этот атрибут дает атомарный доступ к биту. Нефиг туда засовывать массив.

Share this post


Link to post
Share on other sites
Потому что этот атрибут дает атомарный доступ к биту. Нефиг туда засовывать массив.

Что атрибут делает, я знаю. Для того и пишу.

А для проверки вашего категоричного утверждения заменил массив на

uint8_t RcBuf0; //!< Panel Receive Buffer

uint8_t RcBuf1;

Результат - тот же. Да и почему, собственно, "нефиг"? И как влияет уровень оптимизации на "нефиг"?

Структур, подобных этой, у меня с десяток наберется. Правда, без массивов. Но дело, как видите, не в них.

Share this post


Link to post
Share on other sites

Не знаю почему у вас не компилируется. У меня все отлично получается и даже работает в контроллере;)

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

Share this post


Link to post
Share on other sites

Продолжаю. Если добавить атрибут размещения по нужному адресу, то компилируется. Если нет, то нет. :)

#define PAN_INIT {0, 0, 0, 0, 0, 0}
// Pan_t PanCtrl = PAN_INIT;  // не компилируется
Pan_t PanCtrl __attribute__((at(0x20010000))) = PAN_INIT; // компилируется

 

Не знаю почему у вас не компилируется. У меня все отлично получается и даже работает в контроллере;)

С двумя байтами для приема попробуйте. У меня не компилируется точно так же, как и с массивом из двух байтов.

Share this post


Link to post
Share on other sites
С двумя байтами для приема попробуйте. У меня не компилируется точно так же, как и с массивом из двух байтов.

Да действительно, если обращаться к RcBuf0 и RcBuf1, то не компилит, если только RcBuf0(RcBuf1 определен но его не трогаю), то все нормально. Вообще ИМХО в подобного рода структурах не должно быть обычных переменных, массивов и т.п., только битовые определения. Сделайте вложенную структуру.

Share this post


Link to post
Share on other sites
Вообще ИМХО в подобного рода структурах не должно быть обычных переменных, массивов и т.п., только битовые определения.

У меня все было, и компилировалось, и работало. И структура, описанная в первом сообщении, работала для STM32F103.

Share this post


Link to post
Share on other sites

Я как раз все это под 103-им и пробовал.

Share this post


Link to post
Share on other sites

Да, для 103-го то же самое. Помню, было у меня похожее для 151-го. Там компилировалось, но обращалось не туда. Убрал __attribute__((bitband)), и все заработало.

Неладно что-то с этим атрибутом!

Share this post


Link to post
Share on other sites

Вопрос не по теме :

Дайте мне пожалуйста кряк для Keil MDK 4.6

Я только что переехал на windows7 , и тот кряк которым пользовался раньше не запускается.

Share this post


Link to post
Share on other sites
Вопрос не по теме :

Дайте мне пожалуйста кряк для Keil MDK 4.6

Я только что переехал на windows7 , и тот кряк которым пользовался раньше не запускается.

http://rutracker.org/forum/viewtopic.php?t=2305709

Share this post


Link to post
Share on other sites

Кто поможет прояснить такую вещь:

Это ожидание установки бита 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

 

В первом случае в симуле бит устанавливается, во втором - нет.

Кейлобага?

 

*Проверить в железе сейчас не могу.

Share this post


Link to post
Share on other sites

Вспомнил. Ставил 4.60, но вернулся обратно на 4.54 из-за отсутствия человеческих русских букв.

Share this post


Link to post
Share on other sites
Вспомнил. Ставил 4.60, но вернулся обратно на 4.54 из-за отсутствия человеческих русских букв.

и это сделано давно :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this