|
|
  |
Кто-нибудь по шагам по 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)
|
|
|
|
|
Sep 18 2007, 19:30
|

читатель даташитов
   
Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999

|
Цитата(zltigo @ Sep 18 2007, 22:27)  Там одна строчка правится в исходниках: http://electronix.ru/forum/index.php?showt...16114&st=41Ну и, естествено, ключик компилятору.. Читал, спасибо; хочется ведь сразу сделать правильно - подправить кишочки FreeRTOS чтоб поуменьшить количество лишних телодвижений, так что это немного подождет. Спасибо за cstartup, очень помог.
|
|
|
|
|
Mar 8 2009, 00:10
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 5-12-08
Из: Санкт-Петербург
Пользователь №: 42 220

|
Цитата(HARMHARM @ Sep 17 2007, 13:17)  Уважаемый xelax, удались ли вам решить проблему? Имею те же симптомы - возникает prefetch abort в portRESTORE_CONTEXT, правда контроллер LPC2368. Я тоже напоролся на PAbort в последней инструкции макроса portRESTORE_CONTEXT(), выглядящей как SUBS PC, LR, #4 Нагуглил эту тему, но ничего из описанного не помогло - видимо, это другая проблема. Свою глюку я поборол, и решил написать здесь для таких же как я бедолаг, гуглящих решение этой проблемы и попадающих в эту тему. В моем случае все дело было в том, что я в startup.S после инициализации стеков для всех режимов оставлял процессор в режиме System, а надо было оставлять в Supervisor. Из-за этого инструкция LDMFD LR, {R0-R14}^ замещала не ту копию R13 (SP) и R14 (LR), и поэтому последующая команда LDR LR, [LR, #+60] работала с испорченным содержимым LR, и разумеется, переходила по "мусорному" адресу.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|