|
|
  |
FreeRTOS общие вопросы |
|
|
|
Jun 1 2010, 18:32
|

читатель даташитов
   
Группа: Свой
Сообщений: 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. Так в коробке и лежит.
|
|
|
|
|
Feb 14 2011, 09:21
|
.
     
Группа: Участник
Сообщений: 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?
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Feb 14 2011, 09:37
|

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

|
Цитата(GetSmart @ Feb 14 2011, 13:44)  1. Где-нибудь лежит дока на русском о FreeRTOS ? Не встречал Цитата 2. Как запретить (временно) переключение тредов по таймеру без запрета (остальных) прерываний? Код { vTaskSuspendAll(); ... код ... xTaskResumeAll(); } не подходит?
|
|
|
|
|
Feb 15 2011, 08:22
|
Знающий
   
Группа: Участник
Сообщений: 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, то прерывание отработает вперед, чем вы остановите таймер, и уже остановите его когда вернетесь в эту задачу.
|
|
|
|
|
Feb 15 2011, 09:50
|
.
     
Группа: Участник
Сообщений: 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() я проверил расшаривание периферии между несколькими тредами. Пока всё работает и не конфликтует.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Feb 15 2011, 11:13
|

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

|
QUOTE (kan35 @ Feb 15 2011, 11:22)  Вообще, конечно да, vTaskSuspendAll(); xTaskResumeAll() подходят лучше, но в данном случае все равно шедулер будет крутиться, не знаю на сколько это критично "Крутиться" это вообще-то самый в общем случае правильный вариант - сохраняется течение времени и по Resume происходит восстановление с минимизацией проблем возникших из-за приостановки. Такая реализация вместо тупого запрета прерываний один из признаков серьезного похода к реализации OS. Только названия системных вызовов дебильные  , причем в коммерческой версии названия нормальные: vTaskSuspendScheduler() xTaskResumeSchedulerl()
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 3 2011, 10:13
|
Группа: Новичок
Сообщений: 2
Регистрация: 2-02-05
Пользователь №: 2 375

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

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

|
Не куда, а откуда. Начните копать с фиксации факта посылки ARP запроса, например, снифером потом ping... и так постепенно. Ну а остальное. кроме WEB работает? Вообще всякие "примеры" идущие с FreeRTOS это не есть FreeRTOS. Бывает они не работоспособны вообще, у меня, например, даже не задышал порт под Stelaris созданный под именно эту board. Я, правда, и разбираться не стал - мне было проще свой собирать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 3 2011, 11:49
|
Группа: Новичок
Сообщений: 2
Регистрация: 2-02-05
Пользователь №: 2 375

|
Ага, понятно. У меня, просто получилось заставить работать пример RDB1768_Easyweb на LPCXpresso путем замены cr_startup_lpc17.c из примеров для Xpresso. Пробовал их диффать, но просветления не испытал. Собсно, я и думал что тут есть какая-то, не видимая моему глазу, разница в стартовой конфигурации.
Свой собрать, понятное дело, лучше, но я пока в стадии глубокого нуба и пытаюсь вообще понять что к чему...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|