|
Обучение FreeRTOS, Разбирается статья Курниц |
|
|
|
May 26 2012, 21:13
|
Участник

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

|
А кто может подсказать, чем FreeRTOS генерирует эти самые "тики"? Не таймером же - отнимать у юзера периферию не есть гуд... Буду благодарен за объяснение.
|
|
|
|
|
May 26 2012, 21:51
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(ATMExpert @ May 27 2012, 00:13)  А кто может подсказать, чем FreeRTOS генерирует эти самые "тики"? Таймером. Цитата(ATMExpert @ May 27 2012, 00:13)  Не таймером же - отнимать у юзера периферию не есть гуд... Добавление FreeRtos в проект == добавление ещё одного таймера прямо в МК.
|
|
|
|
|
May 27 2012, 07:04
|
Участник

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

|
Цитата(_Артём_ @ May 27 2012, 01:51)  Добавление FreeRtos в проект == добавление ещё одного таймера прямо в МК. А это как, не совсем понимаю. Еще один таймер откуда берется? Если к примеру у меня в проекте используются оба таймера в соих нуждах, то какой таймер использует RTOS?
|
|
|
|
|
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 отдельных таймера в режиме сброс по совпадению
|
|
|
|
|
May 28 2012, 02:42
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(Volldemar @ May 27 2012, 13:06)  FreeRTOS хоть и забирает под свои нужды один аппаратный таймер, но взамен предоставляет программные таймеры, бери-нехочу... FreeRTOS забирает под свои нужды 1 аппаратный таймер. его нужно освободить. Взамент ртос конечно предоставляет таймеры.... но не всегда аппаратный можно заменить программным. если тик == 1 мс, а нужно получить частоту 1 МГц, то ..... тут нужно тик делать 1 мкс. Это не совсем гуд для медленных процесоров (да и для быстрых тоже). Цитата А если мне нужно использовать 2 канала от разных аппаратных таймеров для генерации 2 независимых частот, если частоты невысокие, то можно программным таймером решить проблему, а если высокие, то тут извращатся придётся.... либо как-то аппаратно настраивать совпадения и обработку этих совпадений.... либо запускать аппаратный таймер на какую-то высокую частоту, а в обработчике прерыванию считать тики в две переменные - вот вам две частоты и руками в прерывании дёргать пины.
|
|
|
|
|
Dec 11 2012, 08:45
|
Группа: Участник
Сообщений: 11
Регистрация: 23-01-12
Пользователь №: 69 816

|
Привет знатокам! Начал разбираться с FreeRTOS V7.3.0 на Atmega128+AVRStudio 6. Несколько примеров заработали успешно (мигать светиком + кнопка с выводом события нажатия на LCD 1x16). После решил углубится в использование УАРТА, добавил 2 задачи + 1 прерывание по приему символа. При компиляции серьезных ошибок небыло, кроме 2-х одинаковых "вонингов" вида : Warning 1 cast from pointer to integer of different size [-Wpointer-to-int-cast] G:\......\tasks.c 523 44 AVRGCC1, что указывает на следующую строку кода
pxTopOfStack = ( portSTACK_TYPE * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ( portPOINTER_SIZE_TYPE ) ~portBYTE_ALIGNMENT_MASK ) );
После запуска запуска в дебаге, программа виснет при получении семафора : xSemaphoreTake(xButtonSemaphore, (portTickType)0); детальное изучения висячки привело меня в строку кода portRESTORE_CONTEXT();, после выполнения которой, на вкладке Processor - Registers, все регистры от 0 по 31 имеют значения 00. Т. е я так понимаю что контекст предыдущей задачи не востановился, но почему не могу понять. Этот участок кода работал нормально, пока не добавил ф-ции по работе с уартом. Сейчас полностью убрал эти ф-ции но ошибка осталась и побороть ее ника не могу, и вообще не могу понять в чем дело. Может проблема в "вонингах"? Прошу помощи.
Вот часть кода, которая глючит
void vButtonCheckTask( void *pvParameters ) { portTickType xLastWakeTime; const portTickType xFrequency = 20; //время, через которое проверяется кнопка, мс xLastWakeTime=xTaskGetTickCount(); //Возвращает:Количество тиков начиная с вызова vTaskStartScheduler xSemaphoreTake(xButtonSemaphore, (portTickType)0); //Макрос для получения семафора. <<<< --------глючит здесь во время/при выполнении vButtonInit(); //initialization for (;;) { if (xButtonGetStatus()==pdTRUE) //смотрим кнопку, если нажата { xSemaphoreGive(xButtonSemaphore); // Освобождаем семафор. } vTaskDelayUntil(&xLastWakeTime,xFrequency); //проверяем кнопку каждые 20 мс } }
portSHORT main(void) { vSemaphoreCreateBinary(xButtonSemaphore); // реализует семафор if(xButtonSemaphore!=NULL) // если семафор создан удачно { xTaskCreate( vButtonCheckTask, ( signed char * ) "Button", configMINIMAL_STACK_SIZE, NULL, mainButton_TASK_PRIORITY, NULL ); //реакция на кнопку } xTaskCreate( vLEDFlashTask1, ( signed char * ) "LED", configMINIMAL_STACK_SIZE, NULL, mainLED_TASK_PRIORITY, NULL ); //мигание всетиком
while(1) { } return 0; }
|
|
|
|
|
Dec 17 2012, 11:15
|
Группа: Участник
Сообщений: 11
Регистрация: 23-01-12
Пользователь №: 69 816

|
Разобрался, дело было в ключевом слове "static", переменная семафора была static, что не позволяло ее модифицировать из другой ф-ции (задачи)
|
|
|
|
|
Dec 24 2012, 13:21
|
Группа: Участник
Сообщений: 11
Регистрация: 23-01-12
Пользователь №: 69 816

|
Подскажите, как записать в такую очередь данные???? //определяю ст-ру, которая будет елементом очереди typedef struct { unsigned portBASE_TYPE uint8_Command; int32_t int32_Data_1; int32_t int32_Data_2; unsigned portBASE_TYPE uint8_Data_3; }CmdData;
xQueueCMD = xQueueCreate ( 4, sizeof(CmdData)); //создаем очередь
|
|
|
|
|
Dec 24 2012, 18:50
|
Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182

|
Как любые другие данные по указателю Код xQueueSend(xQueueCMD, &CmdData, 100u / portTICK_RATE_MS); /* ждать 100мс в блокированном состоянии если свободного места нет */
--------------------
typedef enum { no, yes, maybe } bool; | блог тут
|
|
|
|
|
Dec 25 2012, 10:57
|
Группа: Участник
Сообщений: 11
Регистрация: 23-01-12
Пользователь №: 69 816

|
...перед этим нужно заполнить структуру данными что бы ее передать в очередь. Я думал, возможно есть вариант что бы записать значени в переменную структуры прямо в очереди. В любом случае спасибо.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|