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

 
 
 
Reply to this topicStart new topic
> Кто-нибудь по шагам по 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
Сергей Борщ
сообщение 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
Dron_Gus
сообщение Apr 21 2007, 01:54
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



SP и должен выходить за "пределы". ИАР кричит основываясь на данных из файла линкера. Он же не в курсе, что ОС сама назначает стеки для каждого процесса. И лежат они в каком-то внутреннем массиве FreeRTOS (сейчас негде посмотреть). Размер которого, кстати, задается где-то в файле настроек ОС, а не в файле линкера. Так что отключайте плугин Stack или не обращайте на его крики внимание.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
xelax
сообщение Apr 23 2007, 08:56
Сообщение #8


Местный
***

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



Цитата(Dron_Gus @ Apr 21 2007, 02:54) *
SP и должен выходить за "пределы". ИАР кричит основываясь на данных из файла линкера. Он же не в курсе, что ОС сама назначает стеки для каждого процесса. И лежат они в каком-то внутреннем массиве FreeRTOS (сейчас негде посмотреть). Размер которого, кстати, задается где-то в файле настроек ОС, а не в файле линкера. Так что отключайте плугин Stack или не обращайте на его крики внимание.


Ок. Меня больше всего смущало, что беру готовый пример, а там такое творится. Спасибо за ответы, буду дальше разламывать smile.gif
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Sep 17 2007, 10:17
Сообщение #9


читатель даташитов
****

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



Уважаемый xelax, удались ли вам решить проблему? Имею те же симптомы - возникает prefetch abort в portRESTORE_CONTEXT, правда контроллер LPC2368.
Go to the top of the page
 
+Quote Post
xelax
сообщение Sep 18 2007, 05:46
Сообщение #10


Местный
***

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



Цитата(HARMHARM @ Sep 17 2007, 14:17) *
Уважаемый xelax, удались ли вам решить проблему? Имею те же симптомы - возникает prefetch abort в portRESTORE_CONTEXT, правда контроллер LPC2368.


Нет не решил, пришлось отложить проблему в долгий ящик, в связи с переходом на новую работу и сменой lpc на atmel sam7.
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Sep 18 2007, 18:43
Сообщение #11


читатель даташитов
****

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



Решил проблему. Дело оказалось как всегда, в стеке, как уже не раз писал Zltigo. Чуть мозг не сломал. Поскольку я собираю проект с помощью make, ошибка была неявной. Докопался когда не увидел в map файле стеков для fiq и svc. Оказывается, в командной строке линкера мой cstartup.r79 был в самом конце, уже после IAR' овской библиотеки, и не происходил override. Ядро запустилось, правда пока только в thumb.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 18 2007, 19:27
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(HARMHARM @ Sep 18 2007, 21:43) *
Ядро запустилось, правда пока только в thumb.

Там одна строчка правится в исходниках:
http://electronix.ru/forum/index.php?showt...16114&st=41
Ну и, естествено, ключик компилятору..


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Sep 18 2007, 19:30
Сообщение #13


читатель даташитов
****

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



Цитата(zltigo @ Sep 18 2007, 22:27) *
Там одна строчка правится в исходниках:
http://electronix.ru/forum/index.php?showt...16114&st=41
Ну и, естествено, ключик компилятору..

Читал, спасибо; хочется ведь сразу сделать правильно - подправить кишочки FreeRTOS чтоб поуменьшить количество лишних телодвижений, так что это немного подождет.
Спасибо за cstartup, очень помог.
Go to the top of the page
 
+Quote Post
Andrey Vasilyev
сообщение Mar 8 2009, 00:10
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 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, и разумеется, переходила по "мусорному" адресу.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 4th July 2025 - 13:36
Рейтинг@Mail.ru


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