реклама на сайте
подробности

 
 
> Кто-нибудь по шагам по FreeRTOS в IARе ходил
xelax
сообщение Apr 20 2007, 12:02
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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);
}

}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Apr 20 2007, 12:28
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
xelax
сообщение Apr 20 2007, 12:43
Сообщение #3


Местный
***

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



где дописывать этот код?
Go to the top of the page
 
+Quote Post
cebotor
сообщение Apr 20 2007, 14:30
Сообщение #4


Частый гость
**

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



Цитата(xelax @ Apr 20 2007, 13:43) *
где дописывать этот код?

вероятно там , где у вас в проэкте вообще определяется дефайн portINITIAL_SPSR
Вы ведь в ИАРе можете набрать это назвагде нибудь, нажать на тексте правой кнопкой мыши и выбрать "Go nj definition of portINITIAL_SPSR" ?

вообще то это валяется в файле
port.c


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
xelax
сообщение Apr 20 2007, 15:10
Сообщение #5


Местный
***

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



Цитата(cebotor @ Apr 20 2007, 15:30) *
вероятно там , где у вас в проэкте вообще определяется дефайн portINITIAL_SPSR
Вы ведь в ИАРе можете набрать это назвагде нибудь, нажать на тексте правой кнопкой мыши и выбрать "Go nj definition of portINITIAL_SPSR" ?

вообще то это валяется в файле
port.c


wink.gif бывает, торможу.

нашёл строчку где слетает 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 моде тоже. Пробовал разные варианты. Всегда одно и тоже. blink.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 20 2007, 15:15
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 08:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016