реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Keil. Я попал в багу :)
ViKo
сообщение Nov 29 2012, 13:46
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
PoReX
сообщение Nov 30 2012, 05:46
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 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-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 30 2012, 07:17
Сообщение #3


Универсальный солдатик
******

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



Цитата(PoReX @ Nov 30 2012, 08:46) *
Потому что этот атрибут дает атомарный доступ к биту. Нефиг туда засовывать массив.

Что атрибут делает, я знаю. Для того и пишу.
А для проверки вашего категоричного утверждения заменил массив на
uint8_t RcBuf0; //!< Panel Receive Buffer
uint8_t RcBuf1;
Результат - тот же. Да и почему, собственно, "нефиг"? И как влияет уровень оптимизации на "нефиг"?
Структур, подобных этой, у меня с десяток наберется. Правда, без массивов. Но дело, как видите, не в них.
Go to the top of the page
 
+Quote Post
PoReX
сообщение Nov 30 2012, 09:15
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518



Не знаю почему у вас не компилируется. У меня все отлично получается и даже работает в контроллере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
}


--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 30 2012, 09:20
Сообщение #5


Универсальный солдатик
******

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



Продолжаю. Если добавить атрибут размещения по нужному адресу, то компилируется. Если нет, то нет. 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

С двумя байтами для приема попробуйте. У меня не компилируется точно так же, как и с массивом из двух байтов.
Go to the top of the page
 
+Quote Post
PoReX
сообщение Nov 30 2012, 09:32
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518



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

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


--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 30 2012, 09:42
Сообщение #7


Универсальный солдатик
******

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



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

У меня все было, и компилировалось, и работало. И структура, описанная в первом сообщении, работала для STM32F103.
Go to the top of the page
 
+Quote Post
PoReX
сообщение Nov 30 2012, 10:06
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518



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


--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 30 2012, 13:49
Сообщение #9


Универсальный солдатик
******

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



Да, для 103-го то же самое. Помню, было у меня похожее для 151-го. Там компилировалось, но обращалось не туда. Убрал __attribute__((bitband)), и все заработало.
Неладно что-то с этим атрибутом!
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Dec 5 2012, 05:55
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Вопрос не по теме :
Дайте мне пожалуйста кряк для Keil MDK 4.6
Я только что переехал на windows7 , и тот кряк которым пользовался раньше не запускается.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 5 2012, 07:22
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(MiklPolikov @ Dec 5 2012, 09:55) *
Вопрос не по теме :
Дайте мне пожалуйста кряк для Keil MDK 4.6
Я только что переехал на windows7 , и тот кряк которым пользовался раньше не запускается.

http://rutracker.org/forum/viewtopic.php?t=2305709
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 5 2012, 08:42
Сообщение #12


;
******

Группа: Участник
Сообщений: 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


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

*Проверить в железе сейчас не могу.
Go to the top of the page
 
+Quote Post
VAI
сообщение Dec 5 2012, 13:15
Сообщение #13


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



MiklPolikov
или тут


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 5 2012, 13:44
Сообщение #14


Универсальный солдатик
******

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



Вспомнил. Ставил 4.60, но вернулся обратно на 4.54 из-за отсутствия человеческих русских букв.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 5 2012, 14:52
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(ViKo @ Dec 5 2012, 17:44) *
Вспомнил. Ставил 4.60, но вернулся обратно на 4.54 из-за отсутствия человеческих русских букв.

и это сделано давно sm.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 04:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01472 секунд с 7
ELECTRONIX ©2004-2016