Lagman 1 30 апреля, 2014 Опубликовано 30 апреля, 2014 · Жалоба http://www.freertos.org/low-power-tickless-rtos.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 30 апреля, 2014 Опубликовано 30 апреля, 2014 · Жалоба http://www.freertos.org/low-power-tickless-rtos.html Это то что нужно ! Огромное спасибо !!! Кое-что непонятно, поясните пожалуйста : Тут http://www.freertos.org/low-power-tickless-rtos.html сказано, что функция portSUPPRESS_TICKS_AND_SLEEP( xIdleTime ) не определена, пользователю предлагается написать её самому , приведён пример возможного кода. А я вижу в FreeRTOS V8.0.0 что эта функция уже есть написанная, и в ней вызываются функции configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); которые я должен написать сам. Вопрос : почему в описании по ссылке сказано, что portSUPPRESS_TICKS_AND_SLEEP нужно писать самому ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 30 апреля, 2014 Опубликовано 30 апреля, 2014 · Жалоба Я сильно не вникал т.к. не использую режимы энергосбережения, но из написанного на оф.сайте я понял, что если для процессора есть пример с энергосбережением то можно его использовать или написать свою ф-ю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 4 мая, 2014 Опубликовано 4 мая, 2014 · Жалоба Может кто подскажет : Есть задача, которая создаёт несколько других задач, и после этого становится не нужна. Если в конце задачи в бесконечном цикле vTaskDelay то всё хорошо. А если задача сама себя удаляет vTaskDelete(NULL); , то программа оказывается в Hardfault_Handler. Почему так происходит ? Задачи создаю с проверкой Task_Handle==NULL и запрещением переключения контекста на время проверки и создания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 6 мая, 2014 Опубликовано 6 мая, 2014 · Жалоба Разобрался, дело было в недостаточном стеке задачи. В vApplicationStackOverflowHook программа не попадала, сразу HardFault. Ещё один вопрос : Как сохранить неизменной частоту системных тиков при изменении тактовой частоты процессора ? Никаких готовых инструментов не нашёл. Нужно перенастраивать таймер вручную ? А после этого операционка его обратно не перенастроит сама зачем-нибудь ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 7 мая, 2014 Опубликовано 7 мая, 2014 · Жалоба 2MiklPolikov по существу не скажу. такого опыта не имею. ps: я смотрю на вопросы... и любопытстов всё больше и больше.... динамическое создание задач, самоудаление задач, налету изменение системного тика.... Что за проект? Что вы делаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostyan1 0 7 мая, 2014 Опубликовано 7 мая, 2014 · Жалоба 2MiklPolikov, фриртос - это операционка с открытым кодом. Открыл свой проект, нашел в FreeRTOSConfig.h: #define configCPU_CLOCK_HZ ( SystemCoreClock ) Сделал поиск по configCPU_CLOCK_HZ в проекте. Нашел что юзается дефайн в "__weak void vPortSetupTimerInterrupt( void )". Сделал иерархию вызова функции: portBASE_TYPE xPortStartScheduler( void ) <- void vTaskStartScheduler( void ) Следовательно, дефолтные настройки системного таймера применяются ровно один раз в проекте. Если вы хотите менять частоту процессора - то в том же коде перенастаивайте таймер системного тика, и будет вам счастье. Пост писал, гораздо дольше чем залез в код и нашел ответы на ваши вопросы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 7 мая, 2014 Опубликовано 7 мая, 2014 · Жалоба 2MiklPolikov по существу не скажу. такого опыта не имею. ps: я смотрю на вопросы... и любопытстов всё больше и больше.... динамическое создание задач, самоудаление задач, налету изменение системного тика.... Что за проект? Что вы делаете? Например разрабатываю диктофоны, которые производят Телесистемы в Зеленограде. И другие проекты подобного характера. Иными словами, я делаю "гаджеты". 2MiklPolikov, фриртос - это операционка с открытым кодом. Открыл свой проект, нашел в FreeRTOSConfig.h: #define configCPU_CLOCK_HZ ( SystemCoreClock ) Сделал поиск по configCPU_CLOCK_HZ в проекте. Нашел что юзается дефайн в "__weak void vPortSetupTimerInterrupt( void )". Сделал иерархию вызова функции: portBASE_TYPE xPortStartScheduler( void ) <- void vTaskStartScheduler( void ) Следовательно, дефолтные настройки системного таймера применяются ровно один раз в проекте. Если вы хотите менять частоту процессора - то в том же коде перенастаивайте таймер системного тика, и будет вам счастье. Пост писал, гораздо дольше чем залез в код и нашел ответы на ваши вопросы. Да, я то же это находил. Но подумал, вдруг есть неочевидные для меня тонкости. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 27 мая, 2014 Опубликовано 27 мая, 2014 · Жалоба Коллеги, ещё один вопрос : Верно ли я понимаю, что значение, которое возвращает xTaskGetTickCount(); периодически сбрасывается в 0 и начинает расти заново, т.к. переполняется 32х разрядная переменная, которая считает тики , и стало быть, при использовании xTaskGetTickCount(); я должен обрабатывать этот сброс в 0 ? А все функции операционки которые работают со временем (задержка, взять симофор и т.п. ) , то же обрабатывают сброс счётчика тиков в 0 ? МП Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба переполняется 32х разрядная переменная 32-х битная или 16 #if( configUSE_16_BIT_TICKS == 1 ) typedef uint16_t TickType_t; #define portMAX_DELAY 0xffff #else typedef uint32_t TickType_t; #define portMAX_DELAY 0xffffffffUL #endif стало быть, при использовании xTaskGetTickCount(); я должен обрабатывать этот сброс в 0 ?а зачем? А все функции операционки которые работают со временем (задержка, взять симофор и т.п. ) , то же обрабатывают сброс счётчика тиков в 0 ?ээээ.... а это зачем? зарядили симофор на 100. в счетчик симофора 100. каждый тик из счетчика симофора вычитаем 1. как 0 стал - обработали. вобще счетчик тика тут не причем. (код ос не смотрел, но я бы так сделал) допустим typedef uint16_t TickType_t;. текущее значение 0xfffe. зафиксировали. прошло 100 тиков. счетчик стал 0х0062. Для вычисления периода времени из нового значения вычитаем старое, т.е. 0х0062 - 0xfffe, для типов uint16_t разница равно 100 dec. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба juvf, спасибо ! Я всегда работал со временем другим способом, и в нём приходилось проверять, не начался ли счёт с 0 И ещё вопрос. Правильно ли я понимаю работу ОС в целом ? : В устройстве две SD карты. Задача инициализации написана одна, она создаётся в двух экземплярах, в задачу передаётся параметр № карты. Задача вызывает какие-то функции с локальными переменными, те то же вызывают функции и т.д. Правильно ли я понимаю, что при переключении контекста все эти локальные переменные сохраняются в стеке задачи, т.е. физически копируются из одной области памяти в другую ? Если локальные переменные в функциях определены как static, это не влияет на сохранение в стеке ? Получается, что на переписывание контекста в стек и обратно уходит много времени, и стало быть надо стремится сокращать количество локальных переменных ? Все большие массивы нужно определять как глобальные переменные, и работать с ними как с ресурсом ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба я думаю что ос работает не так. есть две задачи. у каждой свой стек. локальные переменные создаются и удаляются в стеке задачи не во время переключения, а во время работы задачи, по мере необходимости.есть указатель на вершину стека. при переключении контекста локальные переменные в каждой задаче ни куда не копируются. копируется только указатель на вершину стека. Т.е. кагбэ ос переключается на др стек. Поэтому от размера стека задачи и от кол-ва локальных переменных время переключение контекста не зависит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Newegor 0 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба juvf, спасибо ! Я всегда работал со временем другим способом, и в нём приходилось проверять, не начался ли счёт с 0 И ещё вопрос. Правильно ли я понимаю работу ОС в целом ? : В устройстве две SD карты. Задача инициализации написана одна, она создаётся в двух экземплярах, в задачу передаётся параметр № карты. Задача вызывает какие-то функции с локальными переменными, те то же вызывают функции и т.д. Правильно ли я понимаю, что при переключении контекста все эти локальные переменные сохраняются в стеке задачи, т.е. физически копируются из одной области памяти в другую ? Если локальные переменные в функциях определены как static, это не влияет на сохранение в стеке ? Получается, что на переписывание контекста в стек и обратно уходит много времени, и стало быть надо стремится сокращать количество локальных переменных ? Все большие массивы нужно определять как глобальные переменные, и работать с ними как с ресурсом ? По поводу переписывания контекства juvf Вам уже ответил. Контекст не переписывается, а переключается. А вот использование static, без понимания, я бы не рекомендовал. При создании такой переменной ее экземпляр будет один и тот же на все задачи. И это может привести к печальным последствиям, если это не учитывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба А вот использование static, без понимания, я бы не рекомендовал. При создании такой переменной ее экземпляр будет один и тот же на все задачи. Newegor, спасибо за информацию про static ! У меня вот это работает, только если возвращаемая переменная static . А если нет, то функция возвращает 0. Как я понимаю, это потому что существование переменной прекращаеся чуть раньше чем программа вышла из функции, и возвращать оказывается нечего. char do_something(void) { chatic char result; //................. return result; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба эта функция или прототип функции объявлен до вызова? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться