|
Кто-нибудь по шагам по FreeRTOS в IARе ходил |
|
|
|
Apr 20 2007, 12:02
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Пытаюсь сейчас переложить FreeRTOS на IAR 4.31 для LPC2214. Натолкнулся на такую фишку в асм файле portasm.s79 в
vPortStartFirstTask: portRESTORE_CONTEXT
При запуске тасков регистр SP выходит за пределы указанные в линкере. IAR начинает постоянно warning'и сыпать. Вопрос спецам, это вообще нормально? Причём готовый пример, который вместе с исходниками скачивается на LPC2129 вытворяет тоже самое в симуляторе.
Поскольку это мой первый опыт общения с РТОСами, на этом всё и за стряло. Запустить пока не получается. Программа пролетает создание и запуск тасков и начинает благополучно слать 55 через uart. Что не так делаю?
#include "system.h" #include "uart.h"
/* Scheduler includes. */ #include "FreeRTOS.h" #include "task.h"
// Task to be created. void vTaskCode( void * pvParameters ) { for( ;; ) { // Task code goes here. UART0WriteChar(0x77); UART1WriteChar(0x77); } }
int main() { // PLL, MAM, Port's initialization SystemInit (); // UART initialization InitUart0(); InitUart1();
// Create the task, storing the handle. xTaskCreate( vTaskCode, "NAME", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); vTaskStartScheduler(); // loop forever while(1) { UART0WriteChar(0x55); UART1WriteChar(0x55); }
}
|
|
|
|
|
 |
Ответов
|
Apr 20 2007, 12:28
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(xelax @ Apr 20 2007, 11:02)  portRESTORE_CONTEXT Не знаю как в последних версиях, а раньше приходилось дописывать Код /* Constants required to setup the initial stack. */ #if __CPU_MODE__ == 1 #define portINITIAL_SPSR ( ( portSTACK_TYPE ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */ #else #define portINITIAL_SPSR ( ( portSTACK_TYPE ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ #endif Иначе если весь проект в ARM mode оно как раз с вашими симптомами и не работало.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 20 2007, 14:30
|

Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809

|
Цитата(xelax @ Apr 20 2007, 13:43)  где дописывать этот код? вероятно там , где у вас в проэкте вообще определяется дефайн portINITIAL_SPSR Вы ведь в ИАРе можете набрать это назвагде нибудь, нажать на тексте правой кнопкой мыши и выбрать "Go nj definition of portINITIAL_SPSR" ? вообще то это валяется в файле port.c
--------------------
если еррата пуста - это не хорошо а плохо
|
|
|
|
|
Apr 20 2007, 15:10
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(cebotor @ Apr 20 2007, 15:30)  вероятно там , где у вас в проэкте вообще определяется дефайн portINITIAL_SPSR Вы ведь в ИАРе можете набрать это назвагде нибудь, нажать на тексте правой кнопкой мыши и выбрать "Go nj definition of portINITIAL_SPSR" ?
вообще то это валяется в файле port.c  бывает, торможу. нашёл строчку где слетает SP Цитата 00000098 E8DE7FFF LDMIA LR, {R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,SP,LR}^ к стати замена portINITIAL_SPSR с 3f на 1f не помогла и переход в thumb моде тоже. Пробовал разные варианты. Всегда одно и тоже.
|
|
|
|
|
Apr 20 2007, 15:15
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(xelax @ Apr 20 2007, 14:10)  нашёл строчку где слетает SP Ну так в этой строчке показано, какие регистры восстанавливаются. Посмотрите, какие на стеке значения в этот момент. Сравните с теми, которые были записаны туда функцией pxPortInitialiseStack, заодно проверьте, правильные ли значения ей передаются. Кстати, в этой строчке SP не слетает, а восстанавливается из стека, возможно с изменением режима (зависит от SPSR и CPSR). Подозреваю, что стека вы для процесса пожалели и на него налезли другие данные. Цитата(xelax @ Apr 20 2007, 14:10)  кстати замена portINITIAL_SPSR с 3f на 1f не помогла и переход в thumb моде тоже надо не заменять и переходить, а написать так, как я вам показал. Вместе с #if. Тогда в зависимости от режима компиляции будет автоматически подставляться нужное значение. Ибо в режиме ARM там должно быть 1F, а в режиме THUMB 3F, и только так а не наоборот.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
xelax Кто-нибудь по шагам по FreeRTOS в IARе ходил Apr 20 2007, 12:02 Dron_Gus SP и должен выходить за "пределы". ИАР к... Apr 21 2007, 01:54 xelax Цитата(Dron_Gus @ Apr 21 2007, 02:54) SP ... Apr 23 2007, 08:56 HARMHARM Уважаемый xelax, удались ли вам решить проблему? И... Sep 17 2007, 10:17 xelax Цитата(HARMHARM @ Sep 17 2007, 14:17) Ува... Sep 18 2007, 05:46 Andrey Vasilyev Цитата(HARMHARM @ Sep 17 2007, 13:17) Ува... Mar 8 2009, 00:10 HARMHARM Решил проблему. Дело оказалось как всегда, в стеке... Sep 18 2007, 18:43 zltigo Цитата(HARMHARM @ Sep 18 2007, 21:43) Ядр... Sep 18 2007, 19:27  HARMHARM Цитата(zltigo @ Sep 18 2007, 22:27) Там о... Sep 18 2007, 19:30
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|