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