Перейти к содержанию
    

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

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

 

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

работает

...

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

 

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

 

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

Test.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__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.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

uint8_t RcBuf0; //!< Panel Receive Buffer

uint8_t RcBuf1;

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Кейлобага?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...