Jump to content

    

Ошибка инициализации стэка v 2.88

Порт для 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)

 

Так должно быть?

 

Share this post


Link to post
Share on other sites
Так должно быть?

Очевидно у каждого процесса свой стек естественно лежащий за пределами системного.

Share this post


Link to post
Share on other sites
При старте, выполнении OSStart() там далее OSStartHighRdy() возникает предупреждение:

 

Если речь идет о выполнении под иар отладчиком, то скорее всего это предупреждение от плагина Stack. Для отладки проектов с вытесняющими осями (точнее говоря для проектов с переключающимися стеками) его нужно отключить. Project > Options > Debug > Plugins > Stack снять галку.

Share this post


Link to post
Share on other sites

А кто нибудь скажет в какой стек (или куда) будут помещатся автоматические данные ,локальные данные в функции прерывания? в юкосе (использую иар)

 

Share this post


Link to post
Share on other sites
А кто нибудь скажет в какой стек (или куда) будут помещатся автоматические данные ,локальные данные в функции прерывания? в юкосе (использую иар)

После какого то времени использования ЮКОС стал замечать что приложение под ЮКОС стало вылетать , зависать. Причем ставишь оптимизацию среднюю то работает высокую не работает ? Ага подумал я ИАР кривой Ставлю без оптимизации тоже виснет.

Точно кривой! Работаю дальше пишу код дальше, теперь и при средней не стал работать. Причем вылетает так что 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 байт видимо для большинства приложений достаточно так как в прерываниях стараются минимизировать затраты на выполнения программы и выделения ресурсов. Но если превысить этот порог то последствия могут быть весьма плачевны, как в моем случае.После того как я увеличил этот стек в соответствии с потребностями все заработало как часы! И я уже не ругал не ИАР не ЮКОС

Вот такая история.

 

Share this post


Link to post
Share on other sites

Инфа любопытная, но съесть в прерывании столько стека - это надо постараться.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this