Jump to content

    
Sign in to follow this  
SapegoAL

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

Recommended Posts

Порт для 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
При старте, выполнении 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this