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

 
 
 
Reply to this topicStart new topic
> Чудеса с оптимизацией, FreeFTOS + STM32F103
GreyM
сообщение May 21 2012, 15:11
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 5-04-11
Из: Москва
Пользователь №: 64 141



Здравствуйте, уважаемые форумчане.

Хочу поделиться с вами историей, которая лично меня привела в ступор.
С недавних пор я занялся тем, что решил запустить FreeFTOS 7.1.0 на STM32F103.

Ситуация осложнялась тем, что я использовал IAR 6.1, в то время как примеры для этой платы были сделаны для IAR 6.3, и мой 6.1 уже не мог корректно открыть такой проект - при попытке открытия сбрасывались все настройки. Но я не расстроился, и выставил все настройки и зависимости вручную. После чего мой код успешно стал уходить в HardFault на инструкции смены стека при попытке запустить первую задачу:

Код
vPortStartFirstTask
    /* Use the NVIC offset register to locate the stack. */
    ldr r0, =0xE000ED08
    ldr r0, [r0]
    ldr r0, [r0]
    /* Set the msp back to the start of the stack. */
    msr msp, r0
    /* Call SVC to start the first task. */
    cpsie i
    svc 0


Я долго бился головой об стену, искал по разным форумам и вообще делал все, что только мог, но проект так и не заработал. Дело осложнялось тем, что я хотел использовать С++ для пользовательской части кода. В конце концов мне улыбнулась удача: на просторах интернета я нашел сайт, на котором его владелец предлагал готовый шаблон проекта для STM32F103 + FreeRTOS 7.1.0 + StdPeriph с использованием С++ - (Ссылка на шаблон. Автор писал, что всё оттестировано на IAR 6.3. В комментах было множество благодарных отзывов и подтверждений корректности работы. Моя версия ИАРа попрежнему не могла корректно открыть проект, поэтому я вручную настроил ссылки на все библиотеки и... Получил hardfault.

После такой неудачи я был окончательно демотивирован и нашел таки установщик иара 6.3. После этого я опять разархивировал проект, открыл его, запустил и был вознагражден мигающей лампочкой. Моему счастью не было предела. Однако, каково же было моё удивление, когда первая версия шаблона, которую я настраивал руками, скомпилированная обновленным ИАРом опять ушла в hardfault. После этого я стал методично сравнивать настройки проекта. Во второй вкладке я дошел до закладки "Оптимизация", которая в шаблоне была выставлена в medium, а в моём проекте была отключена для упрощения отладки. В новом шаблоне я попробовал отключить оптимизацию и - бинго! Он тоже упал.

После этого я пытался играться с параметрами, но любые вариации, при которых оптимизация была ниже средней, приводили контроллер в hardfault. Мне пришлось смириться, ведь, в конце концов, задача была решена. Однако, мой внутренний мир находится в сметении. Я могу понять, что криво написанный код может переставать работать при включении оптимизации. Но как код может переставать работать при её отключении? Заранее благодарен за ваши варианты ответов на этот вопрос.

Сообщение отредактировал GreyM - May 21 2012, 15:12
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 21 2012, 15:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(GreyM @ May 21 2012, 19:11) *
Но как код может переставать работать при её отключении? Заранее благодарен за ваши варианты ответов на этот вопрос.

Как предположение: при отключении оптимизации перестает работать спецификатор inline. Для криво написанного кода этого может быть достаточно...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 21 2012, 17:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(GreyM @ May 21 2012, 18:11) *
Но как код может переставать работать при её отключении?

Элементарно. Начинает работать медленно, и не успевает. Не успевает, например, до следующего прерывания. Грубо говоря, контроллер не выходит из прерывания вообще. inline - верно, но это только часть проблемы.
Несколько моих проектов уже давно работают только на полной оптимизации. В кривости не признаюсь, ибо знал на что шёл.
Зато все понятно написано! sm.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
GreyM
сообщение May 22 2012, 09:52
Сообщение #4





Группа: Новичок
Сообщений: 9
Регистрация: 5-04-11
Из: Москва
Пользователь №: 64 141



Спасибо за доходчивые ответы sm.gif
Мне это как то не пришло в голову, ведь код инициализации совсем небольшой, а контроллер достаточно мощный. Но на будущее буду иметь в виду.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 22 2012, 16:50
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Функции без оптимизации могут потреблять несколько больше стека, чем оптимизированные. Переполнение стека однозначно вызывает сбой программы.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 24 2012, 02:00
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(GreyM @ May 21 2012, 21:11) *
Я долго бился головой об стену, искал по разным форумам и вообще делал все, что только мог, но проект так и не заработал. Дело осложнялось тем, что я хотел использовать С++ для пользовательской части кода. В конце концов мне улыбнулась удача: на просторах интернета я нашел сайт,
...

Не надо биться головой об стену и лазить по форумам где 99% сидят такие же wink.gif
Достаточно прочитать документацию о системе исключений (faults) процессора, написать обработчики исключений и найти точку в программе, которая вызывает исключение, потом проанализировать ассемблерный код до этой точки.
Уйдёт на всё это максимум - день.
Вообще - написание программы должно начинаться с написания грамотной обработки исключений.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 21:26
Рейтинг@Mail.ru


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