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

Всем привет!

Использую Keil 5 для программирования STM32.

Заметил интересную особенность. Выключаю оптимизацию (Level 0), запускаю код, в нем все прозрачно и безобидно - выделяется в функции локальная структура, и я ее заполняю. Выхожу из функции в main, захожу в другую функцию и отладчик отваливается с сообщением

_EB5F6771_1.jpg

Путем проб и ошибок выявил, что, закомментировав одно из заполнений полей структуры,

struct.a = 0;
struct.b = 100;
struct.c = 45;
// struct.d = 50;
struct.e = 150;

все работает. Т.е. поймал багу прямо на строчке заполнения структуры. Если перед объявлением структуры объявить еще что-нибудь, баг тоже исчезает... Подобного никогда не видел. При оптимизации Level 3 все работает, даже при заполнении всех полей структуры. Что там натворил оптимизатор такого?

P.S. И еще вопрос. Почему при оптимизации Level 0

volatile const unsigned int a = 100;

разместится в SRAM, а если она объявлена но не используется по коду - выкидывается вовсе из map-файла (ведь Level 0 предполагает ничего не оптимизировать)? Если просто

const unsigned int a = 100;

то все хорошо - константа будет во Flash.

Для Level 3 вроде как оба случая разместят константу во Flash.

Объясните, пожалуйста, или направьте на нужную информацию.

Изменено пользователем Arlleex

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


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

Больше похоже на то что в камень заливается не то что собралось. Попробуйте делать полный ребилд проекта после смены уровня оптимизации.

Иназвание переменной struct это реальное название или для примера?

Изменено пользователем Fedor

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


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

Пересобирал, чего-только не пересобирал.

Думал, флеш битая, но сделал сравнение файлов в ST-Link Utility, файлы одинаковые.

struct - это название для примера, конечно же =)

 

Еще один момент. Стоит вместо цифры 42 (в реальной железке) в этом поле структуры поставить число 128 - как код не зависает. Но это не выход из положения =)

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


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

вне зависимости от volatile или нет, если символ не используется и размещен в своей секции, то он не линкуется.

более того, я не совсем понимаю как воспринимать константу, которая _изменяется_ неизвестным компилеру способом...

уверен, что компилер не понимает это тоже.

 

а размещение это не компилер, это линкер...

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


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

отладчик отваливается

Еще один момент. Стоит вместо цифры 42 (в реальной железке) в этом поле структуры поставить число 128 - как код не зависает. Но это не выход из положения =)

Так программа зависает, или отладчик отваливается? Это две большие разницы.

 

P.S. И еще вопрос. Почему при оптимизации Level 0

volatile const unsigned int a = 100;

разместится в SRAM, а если она объявлена но не используется по коду - выкидывается вовсе из map-файла (ведь Level 0 предполагает ничего не оптимизировать)?

Выкидывает линкер, а он не в курсе уровня оптимизации.

 

более того, я не совсем понимаю как воспринимать константу, которая _изменяется_ неизвестным компилеру способом...

Например, RO-регистр периферии можно так объявить.

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


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

aaarrr, пардон. Отладчик отваливается с сообщением, внешний вид которого показан на рисунке моего первого сообщения. Поэтому узнать причину я не могу (ладно, если бы там, MemManage Fault был...).

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


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

не совсем понимаю как воспринимать константу, которая _изменяется_ неизвестным компилеру способом...

Слово "константа" здесь может ввести в заблуждение. Точнее будет "переменная, которой нельзя присвоить значение в программе". Значение всё равно может измениться: например, регистр датчика температуры.

 

Путем проб и ошибок выявил, что, закомментировав одно из заполнений полей структуры,

...

все работает.

Это не очень интересно. Гораздо интереснее будет, если удастся найти участок кода, при выполнении которого всё падает. Если по шагам не получается, то нужно ставить точку останова и двигать её, пока глюк не появится/пропадёт.

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


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

Покажу на псевдокоде.

 

int main(void)
{
func1(); // эта функция выполняется
func2(); // при выполнении вот этой отладчик отваливается
}

func1()
{
struct s;

s.a = 0;
s.b = 10;
s.c = 42;
s.d = 50;
init_struct(&struct); // ну, просто настраиваем регистры периферии микроконтроллера этой структурой
}

func2()
{
// запись и чтение внешней памяти
}

 

Вот так - отладчик отваливается при попытке выполнения функции func2.

Стоит закомментировать в func1 строку s.c = 42 или присвоить не 42 а 128 - отладчик не отваливается, функция выполняется. Пробовали 42, 128 и несколько других чисел - с некоторыми отваливается, с некоторыми - нет.

 

Менял размер стека и кучи (ну, в отчаянии), не помогает.

 

Само отваливание происходит при попытке записи во внешнюю память (при выполнении строчки что-то типа *(base_addr + addr) = data). Думаю, это не важно, ведь по сути абсурдно, что, изменив лишь инициализатор переменной, совсем не имеющей отношение к этой операции, результат будет разный - STLink отваливается, или нет.

 

Кроме всего прочего. Если оставить так, что отладчик отваливается, и просто поменять порядок вызова функций (сначала func2, а потом func1) - отладчик не отваливается, память доступна и все счастливы =)

Повторюсь. Это на уровне оптимизации Level 0.

P.S. Отваливание отладчика еще и сопровождается "ввисанием" программы. Т.е. фактически я мониторю каждую выполненную функцию и после нее зажигаю светодиод. Так вот, если отладчик отваливается - не зажигается и светодиод. Когда я не под отладчиком, а просто прошил микроконтроллер и запустил на выполнение, все то же самое - светодиоды молчат. И где контроллер завис - не ясно.

http://www.keil.com/forum/20367/

Ссылка по теме. Правда у них ULINK.

Изменено пользователем Arlleex

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


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

Само отваливание происходит при попытке записи во внешнюю память (при выполнении строчки что-то типа *(base_addr + addr) = data). Думаю, это не важно...

Ошибаетесь. Это очень важно. Если "отваливание" происходит на конкретной инструкции, то дело практически в шляпе. А вы пляшете с бубном и меняете строчки исходника - это абсурд.

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


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

К сожалению, я шагал не по ассемблеровским инструкциям, а по Си-шным. Завтра попробую выловить =) Постараюсь отписаться.

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


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

у меня глупый, возможно, вопрос.

А у вас какой кортекс? Вы случаем в не выровненную память никуда/никак не лезите? Строчку кода убрали, код изменился, выравнивание съехало... нет?

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


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

...Использую Keil 5 для программирования STM32....

 

по внешним признакам было что то подобное с кейлом, под 51 мк.

правда там не си а азм юзал, но суть следующая = тупо изменялся азм на выходе компилятора.

т.е. я нашёл место различия(пара-тройка байт где-то), и после модификации исходников, компиляции - лез в промежуточные файлы = оно родимое.

так-же плавало, так-же влияло и до/после вставка/удаление. вообще не связанное с исходником код. хоть левое, хоть правое - одно цветом.

списал на глюк кейла. т.к. не официальная версия - тупо сообщил на форум просто. т.к. проект корректировался дальше - забил.

прогоны сбоев не дали.

 

осадочек остался :)

 

PS

Да, год этак 2005 где-то...

Изменено пользователем kolobok0

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


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

Golikov A., вопросы не бывают глупыми, вопросы бывают недостаточно освещены =)

Процессорное ядро Cortex M4, у них поддержка невыровненного доступа полностью железная.

И да. Все-таки, в ядрах, в которых вылетало исключение при доступе по невыровненному адресу, компилятор сам выделял всем переменным выровненные адреса =)

kolobok0, в смысле изменялся асм на выходе компилятора? Ты имеешь в виду машинный код? Или прошедший оптимизацию входной асм?

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


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

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

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

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

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

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

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

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

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

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