|
Обучение FreeRTOS, Разбирается статья Курниц |
|
|
|
May 13 2012, 17:24
|
Группа: Новичок
Сообщений: 7
Регистрация: 13-05-12
Пользователь №: 71 815

|
Здравствуйте. Выбрал FreeRTOS для программирования МК AVR(в основном Atmega8,16,32..). В качестве рабочей среды использую AVR Studio 4.19 + AVR-TOOLCHAIN-3.3.0.710, а для обучения взял "FreeRTOS — операционная система для микроконтроллеров" Андрея Курница. И у меня естнственно возникают вопросы. 1. В первом примере (мигание 2мя светодиодами) используется задержка в задачах следующего типа: Код for( ul = 0; ul < 4000L; ul++ ) {} . Но с этой формой задержки у меня работает только одна задача, та которая первая вызывается в главном теле ( Код short main( void ) {....} ). Если использую одну из ф-ий задержек/сна vTaskDelay("Тик"), то работают обе ф-ии на ура. Так вот вообще такая запись как у Курница допускается или автор ее привел просто для понятия, но она никогда не будет работать? Ниже привожу код main.c и FreeRTOSConfig.h. 2. При компиляции этого кода у меня получился hex размером 11кб, на мой взгляд много. Делал все строго по инструкции автора, удалил все ненужное. Автор пишет, что размер ядра составляет 4-9кб, но это пик при использовании всех ф-ии. Так вот, почему же у меня при использовании 2х простых задач получилось уже 11кб? Можно ли как-нибудь программно отключить ненужные файлы. 3. Рассматривать FreeRTOS стал из-за ее популяризации(довольно много находил статей по ней). Может более опытные подскажут какая ОС более оптимальна в соотношении размера hex файла, возможностей и доступности документации? Пишу сюда, потому, что в инете это единственное место на мой взгляд где можно получить ответы по FreeRTOS. Помгоите разобраться. С уважением Дмитрий. main.c Код #include "FreeRTOS.h" #include "task.h"
void vTask1( void *pvParameters ) { volatile unsigned long ul; for(;; ) { PORTC ^= (1 << PC0); for( ul = 0; ul < 4000L; ul++ ) { } } vTaskDelete( NULL ); } void vTask2( void *pvParameters ) { volatile unsigned long ul; for(;; ) { PORTC ^= (1 << PC1); for( ul = 0; ul < 8000L; ul++ ) { } } vTaskDelete( NULL ); } /*-----------------------------------------------------------*/ int main( void ) { DDRC |= (1 << DDC0) | (1 << DDC1); xTaskCreate( vTask1, (signed char *) "Task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); xTaskCreate( vTask2, (signed char *) "Task2", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); vTaskStartScheduler(); return 0; } FreeRTOSConfig.h Код #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H
#include <avr/io.h>
#define configUSE_PREEMPTION 1 #define configUSE_IDLE_HOOK 0//Отключаю vApplicationIdleHook() #define configUSE_TICK_HOOK 0 #define configCPU_CLOCK_HZ ( ( unsigned long ) 8000000 ) #define configTICK_RATE_HZ ( ( portTickType ) 1000 ) #define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 4 ) #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 85 ) #define configTOTAL_HEAP_SIZE ( (size_t ) ( 1500 ) ) #define configMAX_TASK_NAME_LEN ( 8 ) #define configUSE_TRACE_FACILITY 0 #define configUSE_16_BIT_TICKS 1 #define configIDLE_SHOULD_YIELD 1 #define configQUEUE_REGISTRY_SIZE 0 /* Co-routine definitions. */ #define configUSE_CO_ROUTINES 1 #define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
/* Set the following definitions to 1 to include the API function, or zero to exclude the API function. */
#define INCLUDE_vTaskPrioritySet 0 #define INCLUDE_uxTaskPriorityGet 0 #define INCLUDE_vTaskDelete 1 #define INCLUDE_vTaskCleanUpResources 0 #define INCLUDE_vTaskSuspend 0 #define INCLUDE_vTaskDelayUntil 1 #define INCLUDE_vTaskDelay 1
#endif /* FREERTOS_CONFIG_H */
|
|
|
|
|
 |
Ответов
|
May 26 2012, 21:13
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 20-11-09
Из: Ставрополь
Пользователь №: 53 756

|
А кто может подсказать, чем FreeRTOS генерирует эти самые "тики"? Не таймером же - отнимать у юзера периферию не есть гуд... Буду благодарен за объяснение.
|
|
|
|
|
May 27 2012, 07:06
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 27-04-09
Из: Украина
Пользователь №: 48 342

|
Цитата(ATMExpert @ May 27 2012, 00:13)  А кто может подсказать, чем FreeRTOS генерирует эти самые "тики"? Не таймером же - отнимать у юзера периферию не есть гуд... Буду благодарен за объяснение. FreeRTOS хоть и забирает под свои нужды один аппаратный таймер, но взамен предоставляет программные таймеры, бери-нехочу...
|
|
|
|
|
May 27 2012, 07:25
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 20-11-09
Из: Ставрополь
Пользователь №: 53 756

|
Цитата(Volldemar @ May 27 2012, 11:06)  FreeRTOS хоть и забирает под свои нужды один аппаратный таймер, но взамен предоставляет программные таймеры, бери-нехочу... А если мне нужно использовать 2 канала от разных аппаратных таймеров для генерации 2 независимых частот, ну что-то типа режима сброс таймера при совпадении и переключение (toggle) выхода, тогда как? Например, 2 шаговых двигателя, по каждому каналу своя скорость, причем и разгон и торможение нужно использовать.
Сообщение отредактировал ATMExpert - May 27 2012, 07:27
|
|
|
|
|
May 27 2012, 07:32
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(ATMExpert @ May 27 2012, 10:25)  А если мне нужно использовать 2 канала от разных аппаратных таймеров для генерации 2 независимых частот, ну что-то типа режима сброс таймера при совпадении и переключение (toggle) выхода, тогда как? Например, 2 шаговых двигателя, по каждому каналу своя скорость, причем и разгон и торможение нужно использовать. Тогда, если у таймеров не один шим, можно на неиспользуемоё прерывание совпадения повесить Systick RTOS, если частота шима не меняется конечно.
|
|
|
|
|
May 27 2012, 07:41
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 20-11-09
Из: Ставрополь
Пользователь №: 53 756

|
Цитата(_Артём_ @ May 27 2012, 11:32)  Тогда, если у таймеров не один шим, можно на неиспользуемоё прерывание совпадения повесить Systick RTOS, если частота шима не меняется конечно. У таймеров обычно больше двух каналов ШИМ, но ШИМ здесь не используется, применяется режим изменения частоты генерируемой таймером, т.е. применительно для ШД - изменяется скорость step. Я обычно (на AVR) применял 2 отдельных таймера в режиме сброс по совпадению
|
|
|
|
Сообщений в этой теме
EmDMAl Обучение FreeRTOS May 13 2012, 17:24 iosifk Цитата(EmDMAl @ May 13 2012, 21:24) ..., ... May 13 2012, 17:48 Cosmojam Цитата(EmDMAl @ May 13 2012, 20:24) 2. Пр... May 13 2012, 19:08 Volldemar Или применять утилиту hex2bin.exe для преобразован... May 14 2012, 04:49 Terminator Цитата(Volldemar @ May 14 2012, 11:49) Ил... May 14 2012, 09:29 juvf 1. две задачи с равным приоритетом при вытесняющей... May 15 2012, 02:48 EmDMAl 1.
Оказывется в Proteus 7.7. sp3 этот код работае... May 15 2012, 05:03 juvf Цитата(EmDMAl @ May 15 2012, 11:03) uOS -... May 15 2012, 05:43 EmDMAl Цитата(EmDMAl @ May 15 2012, 09:03) Напис... May 15 2012, 18:09 Volldemar У меня вот такой main работал без проблем:
Код#inc... May 17 2012, 07:29 EmDMAl 1. Кто-нибудь, устанавливал компилятор Open Watcom... May 17 2012, 07:40 EmDMAl Цитата(EmDMAl @ May 17 2012, 11:40) 1. Кт... May 17 2012, 08:35 Volldemar Я компиляю в эклипсе+winavr May 17 2012, 07:48 EmDMAl При повторной установки новой версии ошибки с поис... May 20 2012, 12:36  _Артём_ Цитата(ATMExpert @ May 27 2012, 00:13) А ... May 26 2012, 21:51   ATMExpert Цитата(_Артём_ @ May 27 2012, 01:51) Доба... May 27 2012, 07:04   MrYuran xx
Написал, не подумав, поскипал. Dec 11 2012, 08:47    wellcom Цитата(MrYuran @ Dec 11 2012, 12:47) xx
... Dec 11 2012, 10:13   juvf Цитата(Volldemar @ May 27 2012, 13:06) Fr... May 28 2012, 02:42 wellcom Привет знатокам! Начал разбираться с FreeRTOS ... Dec 11 2012, 08:45 wellcom Разобрался, дело было в ключевом слове "stati... Dec 17 2012, 11:15 wellcom Подскажите, как записать в такую очередь данные???... Dec 24 2012, 13:21 Cosmojam Как любые другие данные по указателю
КодxQueueSend... Dec 24 2012, 18:50 wellcom ...перед этим нужно заполнить структуру данными чт... Dec 25 2012, 10:57
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|