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

 
 
> Оптимизация в Keil
Arlleex
сообщение Jul 21 2015, 18:24
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



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

Путем проб и ошибок выявил, что, закомментировав одно из заполнений полей структуры,
Код
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 - Jul 21 2015, 18:25
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Arlleex
сообщение Jul 21 2015, 19:32
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



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

Код
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 - Jul 21 2015, 19:45
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 21 2015, 19:54
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Ошибаетесь. Это очень важно. Если "отваливание" происходит на конкретной инструкции, то дело практически в шляпе. А вы пляшете с бубном и меняете строчки исходника - это абсурд.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Arlleex   Оптимизация в Keil   Jul 21 2015, 18:24
- - Fedor   Больше похоже на то что в камень заливается не то ...   Jul 21 2015, 18:42
|- - Arlleex   Пересобирал, чего-только не пересобирал. Думал, фл...   Jul 21 2015, 18:49
- - diwil   вне зависимости от volatile или нет, если символ н...   Jul 21 2015, 18:54
|- - scifi   Цитата(diwil @ Jul 21 2015, 21:54) не сов...   Jul 21 2015, 19:16
- - aaarrr   Цитата(Arlleex @ Jul 21 2015, 21:24) отла...   Jul 21 2015, 19:02
- - Arlleex   aaarrr, пардон. Отладчик отваливается с сообщением...   Jul 21 2015, 19:11
|- - Fedor   Если структуру struct s; объявить глобальной или ...   Jul 21 2015, 19:42
||- - Arlleex   Fedor, глобальной - не отваливается. Статической -...   Jul 21 2015, 19:46
- - Arlleex   К сожалению, я шагал не по ассемблеровским инструк...   Jul 21 2015, 19:56
- - Golikov A.   у меня глупый, возможно, вопрос. А у вас какой ко...   Jul 22 2015, 06:24
- - kolobok0   Цитата(Arlleex @ Jul 21 2015, 21:24) ...И...   Jul 22 2015, 07:21
- - Arlleex   Golikov A., вопросы не бывают глупыми, вопросы быв...   Jul 22 2015, 18:56
|- - kolobok0   Цитата(Arlleex @ Jul 22 2015, 21:56) ...в...   Jul 23 2015, 09:45
- - Golikov A.   А никаких модулей защиты памяти и прочей байды слу...   Jul 23 2015, 05:26
- - Booger   Добрый день! Не стал создавать новую тему. Воп...   Feb 5 2016, 12:44
|- - scifi   Цитата(Booger @ Feb 5 2016, 15:44) Может ...   Feb 5 2016, 13:15
- - vlad_new   Я не раз нарывался на проблеммы с оптимизатором в ...   Feb 7 2016, 00:24
|- - scifi   Цитата(vlad_new @ Feb 7 2016, 03:24) Я не...   Feb 7 2016, 06:45
- - ViKo   Я считаю, что работоспособность программы при любы...   Feb 7 2016, 05:58
|- - zltigo   QUOTE (ViKo @ Feb 7 2016, 07:58) Я считаю...   Feb 7 2016, 06:42
|- - ViKo   Цитата(zltigo @ Feb 7 2016, 09:42) Именно...   Feb 7 2016, 08:38
|- - scifi   Цитата(ViKo @ Feb 7 2016, 11:38) Иногда в...   Feb 7 2016, 09:11
|- - zltigo   QUOTE (ViKo @ Feb 7 2016, 10:38) Иногда в...   Feb 7 2016, 09:37
- - RabidRabbit   На выравнивание pdwVal смотрите. Возможно при O0 к...   Feb 8 2016, 03:51
- - Booger   В том то и дело, товарищи! Работает на всех ур...   Feb 8 2016, 04:14
- - Сергей Борщ   Смею предположить, что с включенной оптимизацией к...   Feb 8 2016, 05:44
- - Booger   Спасибо всем за помощь! Действительно, если и...   Feb 9 2016, 05:30
- - GetSmart   В 4-ом Кейле (точнее не скажу) для ARM7 таргета ви...   Feb 9 2016, 22:20


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:17
Рейтинг@Mail.ru


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