ATMExpert 0 26 мая, 2012 Опубликовано 26 мая, 2012 · Жалоба А кто может подсказать, чем FreeRTOS генерирует эти самые "тики"? Не таймером же - отнимать у юзера периферию не есть гуд... Буду благодарен за объяснение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 26 мая, 2012 Опубликовано 26 мая, 2012 · Жалоба А кто может подсказать, чем FreeRTOS генерирует эти самые "тики"? Таймером. Не таймером же - отнимать у юзера периферию не есть гуд... Добавление FreeRtos в проект == добавление ещё одного таймера прямо в МК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ATMExpert 0 27 мая, 2012 Опубликовано 27 мая, 2012 · Жалоба Добавление FreeRtos в проект == добавление ещё одного таймера прямо в МК. А это как, не совсем понимаю. Еще один таймер откуда берется? Если к примеру у меня в проекте используются оба таймера в соих нуждах, то какой таймер использует RTOS? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ur5cuj 0 27 мая, 2012 Опубликовано 27 мая, 2012 · Жалоба А кто может подсказать, чем FreeRTOS генерирует эти самые "тики"? Не таймером же - отнимать у юзера периферию не есть гуд... Буду благодарен за объяснение. FreeRTOS хоть и забирает под свои нужды один аппаратный таймер, но взамен предоставляет программные таймеры, бери-нехочу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ATMExpert 0 27 мая, 2012 Опубликовано 27 мая, 2012 (изменено) · Жалоба FreeRTOS хоть и забирает под свои нужды один аппаратный таймер, но взамен предоставляет программные таймеры, бери-нехочу... А если мне нужно использовать 2 канала от разных аппаратных таймеров для генерации 2 независимых частот, ну что-то типа режима сброс таймера при совпадении и переключение (toggle) выхода, тогда как? Например, 2 шаговых двигателя, по каждому каналу своя скорость, причем и разгон и торможение нужно использовать. Изменено 27 мая, 2012 пользователем ATMExpert Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 27 мая, 2012 Опубликовано 27 мая, 2012 · Жалоба А если мне нужно использовать 2 канала от разных аппаратных таймеров для генерации 2 независимых частот, ну что-то типа режима сброс таймера при совпадении и переключение (toggle) выхода, тогда как? Например, 2 шаговых двигателя, по каждому каналу своя скорость, причем и разгон и торможение нужно использовать. Тогда, если у таймеров не один шим, можно на неиспользуемоё прерывание совпадения повесить Systick RTOS, если частота шима не меняется конечно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ATMExpert 0 27 мая, 2012 Опубликовано 27 мая, 2012 · Жалоба Тогда, если у таймеров не один шим, можно на неиспользуемоё прерывание совпадения повесить Systick RTOS, если частота шима не меняется конечно. У таймеров обычно больше двух каналов ШИМ, но ШИМ здесь не используется, применяется режим изменения частоты генерируемой таймером, т.е. применительно для ШД - изменяется скорость step. Я обычно (на AVR) применял 2 отдельных таймера в режиме сброс по совпадению Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 10 28 мая, 2012 Опубликовано 28 мая, 2012 · Жалоба FreeRTOS хоть и забирает под свои нужды один аппаратный таймер, но взамен предоставляет программные таймеры, бери-нехочу... FreeRTOS забирает под свои нужды 1 аппаратный таймер. его нужно освободить. Взамент ртос конечно предоставляет таймеры.... но не всегда аппаратный можно заменить программным. если тик == 1 мс, а нужно получить частоту 1 МГц, то ..... тут нужно тик делать 1 мкс. Это не совсем гуд для медленных процесоров (да и для быстрых тоже). А если мне нужно использовать 2 канала от разных аппаратных таймеров для генерации 2 независимых частот, если частоты невысокие, то можно программным таймером решить проблему, а если высокие, то тут извращатся придётся.... либо как-то аппаратно настраивать совпадения и обработку этих совпадений.... либо запускать аппаратный таймер на какую-то высокую частоту, а в обработчике прерыванию считать тики в две переменные - вот вам две частоты и руками в прерывании дёргать пины. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wellcom 0 11 декабря, 2012 Опубликовано 11 декабря, 2012 · Жалоба Привет знатокам! Начал разбираться с 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 11 декабря, 2012 Опубликовано 11 декабря, 2012 · Жалоба xx Написал, не подумав, поскипал. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wellcom 0 11 декабря, 2012 Опубликовано 11 декабря, 2012 (изменено) · Жалоба xx и как это перевести/применить? вот весь проект http://kazus.ru/forums/showpost.php?p=5790...mp;postcount=50 Изменено 11 декабря, 2012 пользователем wellcom Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wellcom 0 17 декабря, 2012 Опубликовано 17 декабря, 2012 · Жалоба Разобрался, дело было в ключевом слове "static", переменная семафора была static, что не позволяло ее модифицировать из другой ф-ции (задачи) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wellcom 0 24 декабря, 2012 Опубликовано 24 декабря, 2012 · Жалоба Подскажите, как записать в такую очередь данные???? //определяю ст-ру, которая будет елементом очереди 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)); //создаем очередь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cosmojam 0 24 декабря, 2012 Опубликовано 24 декабря, 2012 · Жалоба Как любые другие данные по указателю xQueueSend(xQueueCMD, &CmdData, 100u / portTICK_RATE_MS); /* ждать 100мс в блокированном состоянии если свободного места нет */ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wellcom 0 25 декабря, 2012 Опубликовано 25 декабря, 2012 · Жалоба ...перед этим нужно заполнить структуру данными что бы ее передать в очередь. Я думал, возможно есть вариант что бы записать значени в переменную структуры прямо в очереди. В любом случае спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться