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

 
 
5 страниц V  « < 3 4 5  
Reply to this topicStart new topic
> FreeRTOS общие вопросы
HARMHARM
сообщение Jun 1 2010, 18:32
Сообщение #61


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

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



Цитата(lazarev andrey @ Jun 1 2010, 17:35) *
как можно корректно отлаживать проект под freertos? среда IAR...

Отложить отладчик и пользоваться головой.
Реально уперся два раза при отладке. Один раз переполнение буфера, написал обработчик DABT/PABT с выводом в консоль. Второй раз уперся в spurious interrupt в UARTе LPC23xx, просто подумал как следует. Объем кода С++ под 60 тысяч строк, 250 кб бинарник.
Как начал работать с ARM, купил себе JetLink. Так в коробке и лежит.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 14 2011, 07:44
Сообщение #62


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



У меня тоже есть общие вопросы.

1. Где-нибудь лежит дока на русском о FreeRTOS ?

2. Как запретить (временно) переключение тредов по таймеру без запрета (остальных) прерываний?

Сообщение отредактировал GetSmart - Feb 14 2011, 09:16


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
kan35
сообщение Feb 14 2011, 09:15
Сообщение #63


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



самое простое - запретить прерывание от этого таймера.
Штатные taskENTER_CRITICAL запрещают прерывания.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 14 2011, 09:21
Сообщение #64


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(kan35 @ Feb 14 2011, 14:15) *
самое простое - запретить прерывание от этого таймера.

Проц новый - LPC1768. Я пока толком не разобрался как это делается для SysTick таймера. Пока только сделал это

Код
#if ( configUSE_PREEMPTION == 1 )
    #define __disable_PREEMPTION()    *( volatile unsigned long *)0xe000e010 &= ~0x00000001
    #define __enable_PREEMPTION()    *( volatile unsigned long *)0xe000e010 |= 0x00000001
#else
    #define __disable_PREEMPTION()    {}
    #define __enable_PREEMPTION()    {}
#endif

Но это не запрещает прерывание от SysTick, а на время останавливает таймер.

Может кто знает как отключать прерывания от System Tick Timer?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Terminator
сообщение Feb 14 2011, 09:37
Сообщение #65


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



Цитата(GetSmart @ Feb 14 2011, 13:44) *
1. Где-нибудь лежит дока на русском о FreeRTOS ?

Не встречал
Цитата
2. Как запретить (временно) переключение тредов по таймеру без запрета (остальных) прерываний?

Код
{
vTaskSuspendAll();
... код ...
xTaskResumeAll();
}
не подходит?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 14 2011, 09:56
Сообщение #66


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Terminator @ Feb 14 2011, 14:37) *
не подходит?

Если оно делает то, что мне надо, то подходит.
А то в моей версии остановки таймера есть один косяк. Таймер может остановиться в районе перехода 0->max и прерывание сработает. Тогда по таймеру больше переключений не будет.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
kan35
сообщение Feb 15 2011, 08:22
Сообщение #67


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Цитата(GetSmart @ Feb 14 2011, 12:56) *
Если оно делает то, что мне надо, то подходит.
А то в моей версии остановки таймера есть один косяк. Таймер может остановиться в районе перехода 0->max и прерывание сработает. Тогда по таймеру больше переключений не будет.

Вообще, конечно да,
vTaskSuspendAll();
xTaskResumeAll()
подходят лучше, но в данном случае все равно шедулер будет крутиться, не знаю на сколько это критично

Как запретить тики от таймера, смотрим как делается установка таймера, и по аналогии делаем обратные действия
Код
void prvSetupTimerInterrupt( void )
{
    /* Configure SysTick to interrupt at the requested rate. */
    *(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
    *(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE;
}

То есть типа
Код
*(portNVIC_SYSTICK_CTRL) &= ~(portNVIC_SYSTICK_ENABLE);

И с другой стороны это действие есть остановка системного времени если что... Не всегда это желательно.
А вообще, как что делается с таймером надо смотреть в на сайте ARM, у NXP описания наверное не будет

А если он остановится в районе перехода с 0 в MAX, то прерывание отработает вперед, чем вы остановите таймер, и уже остановите его когда вернетесь в эту задачу.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 15 2011, 09:50
Сообщение #68


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(kan35 @ Feb 15 2011, 13:22) *
То есть типа
Код
*(portNVIC_SYSTICK_CTRL) &= ~(portNVIC_SYSTICK_ENABLE);

И с другой стороны это действие есть остановка системного времени если что... Не всегда это желательно.
А вообще, как что делается с таймером надо смотреть в на сайте ARM, у NXP описания наверное не будет

А если он остановится в районе перехода с 0 в MAX, то прерывание отработает вперед, чем вы остановите таймер, и уже остановите его когда вернетесь в эту задачу.

Именно этот код остановки я и приводил. Т.к. дефайны portNVIC_SYSTICK_CTRL и др. определены только в port.c, то я их заменил на константы.

Дело в том, что если "прерывание отработает вперёд", то именно в этот момент тред может переключиться. И если вдруг в другом треде (долго) не будет самоинициируемых переключений треда, то он не даст работать другим тредам. Вот такой глюк-косяк.

С vTaskSuspendAll() + xTaskResumeAll() я проверил расшаривание периферии между несколькими тредами. Пока всё работает и не конфликтует.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 15 2011, 11:13
Сообщение #69


Гуру
******

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



QUOTE (kan35 @ Feb 15 2011, 11:22) *
Вообще, конечно да,
vTaskSuspendAll();
xTaskResumeAll()
подходят лучше, но в данном случае все равно шедулер будет крутиться, не знаю на сколько это критично

"Крутиться" это вообще-то самый в общем случае правильный вариант - сохраняется течение времени и по Resume происходит восстановление с минимизацией проблем возникших из-за приостановки. Такая реализация вместо тупого запрета прерываний один из признаков серьезного похода к реализации OS.
Только названия системных вызовов дебильные sad.gif, причем в коммерческой версии названия нормальные:
vTaskSuspendScheduler()
xTaskResumeSchedulerl()



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
hip
сообщение Mar 3 2011, 10:13
Сообщение #70





Группа: Новичок
Сообщений: 2
Регистрация: 2-02-05
Пользователь №: 2 375



Вопрос такой: пытаюсь запустить пример из Demo/CORTEX_LPC1768_GCC_RedSuite на LPCXpresso1768 + Base board.
Все прошивается и запускается, но не могу достучаться до веб сервера (пишет что превышено время ожидания).
Посмотрел демо борды, принципиальных отличий по обвязке (имею ввиду ethernet) не нашел.

Подскажите куда копать, плиз?

Спасибо!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 3 2011, 11:17
Сообщение #71


Гуру
******

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



Не куда, а откуда. Начните копать с фиксации факта посылки ARP запроса, например, снифером потом ping... и так постепенно. Ну а остальное. кроме WEB работает? Вообще всякие "примеры" идущие с FreeRTOS это не есть FreeRTOS. Бывает они не работоспособны вообще, у меня, например, даже не задышал порт под Stelaris созданный под именно эту board. Я, правда, и разбираться не стал - мне было проще свой собирать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
hip
сообщение Mar 3 2011, 11:49
Сообщение #72





Группа: Новичок
Сообщений: 2
Регистрация: 2-02-05
Пользователь №: 2 375



Ага, понятно.
У меня, просто получилось заставить работать пример RDB1768_Easyweb на LPCXpresso путем замены cr_startup_lpc17.c из примеров для Xpresso. Пробовал их диффать, но просветления не испытал. Собсно, я и думал что тут есть какая-то, не видимая моему глазу, разница в стартовой конфигурации.

Свой собрать, понятное дело, лучше, но я пока в стадии глубокого нуба и пытаюсь вообще понять что к чему...

Go to the top of the page
 
+Quote Post

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

 


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


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