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

 
 
> stm32 проблемы в обьявлении глобальных переменных, в зависимости от расположения в коде разные баги
ierofant
сообщение Nov 11 2011, 00:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 3-02-11
Из: Украина, Киев
Пользователь №: 62 695



Всем привет.
Возникла странная проблема с которой я не могу разобратся.

Контроллер - STM32F100RB. Компилятор - IAR for ARM 6.21

Есть обьявление глобальных переменных:

Код
uint16_t b[50]; //тест
uint16_t b1[50]; //тест
unsigned char time_to_break=0;
unsigned int counter=0;
unsigned char ban=0;
unsigned char push_button=0;
....
еще несколько переменных
....
unsigned char test[100];


В этом случае еще до входа в главную функцию массив test заполнен символами "я".

Если записать к примеру unsigned char test[]="hello my sweety"; , то остальные переменные будут содержать неверные и произвольные значения + контроллер зависает в B HardFault_Handler.

Если обьявление массивов b1 и b2 разместить после обьявления всех остальных переменных, то будет та же ситуация. - неверные значения остальных переменных и зависание B HardFault_Handler.

В общем от перестановки местами строчек обьявления переменных конечная работа устройства очень меняется и в большинстве случаев имеет какую-то проблему.

У меня есть подозрения, что из-за различности типов (char, uint) или еще из-за чего-то происходит неправильное размещение переменных в оперативной памяти. (и они как-то накладываются) Если это так, то как решается? Если нет:
Подскажите, в чем проблема и как с ней бороться. Буду очень признателен.

Заранее благодарен за помощь.

Сообщение отредактировал ierofant - Nov 11 2011, 00:32
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ierofant
сообщение Nov 11 2011, 14:30
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 3-02-11
Из: Украина, Киев
Пользователь №: 62 695



Нашел ошибку.

Была она в некорректном применении созданых тестовых массивов.

Инициализировал так :
Код
uint16_t b[50];
uint16_t b1[50];


А так обрабатывались( i<99):
Код

for(int i=0; i<99; i++)
{b[i]= *p1;
p1++;}


Значение 99 перекочевало с предыдущей функции, когда использовался 100 элементный массив.
Исправил на 49 - все работает нормально.
А в .map все нормально, потому и начал искать в других местах промах. Ошибка глупая такая, стыдно.

Кстати, нигде не предусмотренна защита от превышения количества обьявленных элементов массива?


Всем большое спасибо за участие и помощь!

Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 11 2011, 14:57
Сообщение #3


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(ierofant @ Nov 11 2011, 16:30) *
Кстати, нигде не предусмотренна защита от превышения количества обьявленных элементов массива?


Обычно она "предусморена" в голове прогграммиста, который вместо:
Код
uint16_t b[50];
uint16_t b1[50];

for(int i=0; i<99; i++)
{b[i]= *p1;
p1++;}


пишет так:
Код
#define ARRAY_SIZE  50

uint16_t b[ARRAY_SIZE];
uint16_t b1[ARRAY_SIZE];

for(int i=0; i<ARRAY_SIZE-1; i++)
{b[i]= *p1;
p1++;}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 11 2011, 20:22
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Allregia @ Nov 11 2011, 17:57) *
#define ARRAY_SIZE 50


CODE
for(unsigned int i=0; i<sizeof(b)/sizeof(b[0]); i++)


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 11:02
Рейтинг@Mail.ru


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