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

 
 
> Ошибка инициализации стэка v 2.88
SasaVitebsk
сообщение Jul 14 2010, 02:16
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Порт для LPC2478 v2.88

Взял готовый пример с сайта UCOS. Обновил файлы OS до 2.88.

При старте, выполнении OSStart() там далее OSStartHighRdy() возникает предупреждение:
Wed Jul 14 13:12:57 2010: The stack pointer for stack 'SVC_STACK' (currently 0x40000C0C) is outside the stack range (0x40000140 to 0x40000240)

Так должно быть?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ig_z
сообщение Jul 14 2010, 03:25
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



QUOTE (SasaVitebsk @ Jul 14 2010, 13:16) *
При старте, выполнении OSStart() там далее OSStartHighRdy() возникает предупреждение:


Если речь идет о выполнении под иар отладчиком, то скорее всего это предупреждение от плагина Stack. Для отладки проектов с вытесняющими осями (точнее говоря для проектов с переключающимися стеками) его нужно отключить. Project > Options > Debug > Plugins > Stack снять галку.
Go to the top of the page
 
+Quote Post
Jurdens
сообщение Dec 15 2010, 05:04
Сообщение #3


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

Группа: Свой
Сообщений: 107
Регистрация: 9-07-05
Пользователь №: 6 656



А кто нибудь скажет в какой стек (или куда) будут помещатся автоматические данные ,локальные данные в функции прерывания? в юкосе (использую иар)
Go to the top of the page
 
+Quote Post
Jurdens
сообщение Dec 15 2010, 07:14
Сообщение #4


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

Группа: Свой
Сообщений: 107
Регистрация: 9-07-05
Пользователь №: 6 656



Цитата(Jurdens @ Dec 15 2010, 11:04) *
А кто нибудь скажет в какой стек (или куда) будут помещатся автоматические данные ,локальные данные в функции прерывания? в юкосе (использую иар)

После какого то времени использования ЮКОС стал замечать что приложение под ЮКОС стало вылетать , зависать. Причем ставишь оптимизацию среднюю то работает высокую не работает ? Ага подумал я ИАР кривой Ставлю без оптимизации тоже виснет.
Точно кривой! Работаю дальше пишу код дальше, теперь и при средней не стал работать. Причем вылетает так что JTAG перестает функционировать. Начинаю разбираться вижу что стек разрушается и при выходе из исключения(прерывания) улетает не туда.
Вспоминаю что при дебаге ИАР все о каком то несоответствии стека предупреждал
The stack pointer for stack 'SVC_STACK' (currently 0x40003088) is outside the stack range (0x40007C18 to 0x40009C08)
Но по совету людей из форума я не обращал на это внимание .Решил обратить
Разобрался .Оказывается (хотя многие может и знают об этом) все задачи в ЮКОСе стартуют в режиме супервизора и рабочим указателем стеком является стек SVC_STACK в ИАРе так называется , хотя реально это регистр R13 из набора регистров режима супервизора
Юкос ,при переключении задач, постоянно его переинициализирует, значениями которые мы ему прописали
Например стеки задачь выглядят так
OS_STK AppTaskDyspStk[APP_TASK_DYSP_STK_SIZE]; // Отображение на дисплей
OS_STK AppTaskTouchscreenStk[APP_TASK_TOUCHSCREEN_STK_SIZE]; // точскрин
OS_STK AppTaskKeyStk[APP_TASK_KEY_STK_SIZE]; // кнопки

Размеры стека определяются где ни будь в app_cfg.h

#define APP_TASK_KEY_STK_SIZE 128 // ОС вью диагностика
#define APP_TASK_TOUCHSCREEN_STK_SIZE 255 // Стартовая задача
#define APP_TASK_DYSP_STK_SIZE 512 // Дисплей
…….
В процессе работы ОС постоянно перезаписывает значение указателя стека r13 значением адреса одного из массивов, AppTaskTouchscreenStk, AppTaskKeyStk, AppTaskDyspStk в зависимости от текущей задачи
Поэтому иаровский плагин стека ничего не понимает и выдает предупреждение ,которое я привел выше, и в поле SVC_STACK показывается не верный стек. И в этом смысле обращять внимание на это окошко ненужно и вообще отключить этот плаг можно
Но вот вопрос А куда будут грузится локальные данные программы обработки прерывания ?
ОПА! Многие годы не задавался этим вопросом и все работало.
Так вот есть такой os_cpu.h
Там и описан стек для прерываний (исключений )
OS_CPU_EXT OS_STK OS_CPU_ExceptStk[OS_CPU_EXCEPT_STK_SIZE];
Его размер OS_CPU_EXCEPT_STK_SIZE Определен там же выше
#define OS_CPU_EXCEPT_STK_SIZE 128
И всего 128 байт видимо для большинства приложений достаточно так как в прерываниях стараются минимизировать затраты на выполнения программы и выделения ресурсов. Но если превысить этот порог то последствия могут быть весьма плачевны, как в моем случае.После того как я увеличил этот стек в соответствии с потребностями все заработало как часы! И я уже не ругал не ИАР не ЮКОС
Вот такая история.
Go to the top of the page
 
+Quote Post



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

 


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


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