Jump to content

    

Несколько вопросов начинающего

Это то что нужно ! Огромное спасибо !!!

 

Кое-что непонятно, поясните пожалуйста :

Тут

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 нужно писать самому ?

Share this post


Link to post
Share on other sites

Я сильно не вникал т.к. не использую режимы энергосбережения, но из написанного на оф.сайте я понял, что если для процессора есть пример с энергосбережением то можно его использовать или написать свою ф-ю.

Share this post


Link to post
Share on other sites

Может кто подскажет :

Есть задача, которая создаёт несколько других задач, и после этого становится не нужна.

Если в конце задачи в бесконечном цикле vTaskDelay то всё хорошо. А если задача сама себя удаляет vTaskDelete(NULL); , то программа оказывается в Hardfault_Handler. Почему так происходит ? Задачи создаю с проверкой Task_Handle==NULL и запрещением переключения контекста на время проверки и создания.

post-24702-1399229898_thumb.jpg

Share this post


Link to post
Share on other sites

Разобрался, дело было в недостаточном стеке задачи. В vApplicationStackOverflowHook программа не попадала, сразу HardFault.

 

Ещё один вопрос :

Как сохранить неизменной частоту системных тиков при изменении тактовой частоты процессора ? Никаких готовых инструментов не нашёл. Нужно перенастраивать таймер вручную ? А после этого операционка его обратно не перенастроит сама зачем-нибудь ?

Share this post


Link to post
Share on other sites

2MiklPolikov

по существу не скажу. такого опыта не имею.

ps: я смотрю на вопросы... и любопытстов всё больше и больше.... динамическое создание задач, самоудаление задач, налету изменение системного тика....

Что за проект? Что вы делаете?

Share this post


Link to post
Share on other sites

2MiklPolikov, фриртос - это операционка с открытым кодом.

 

Открыл свой проект, нашел в FreeRTOSConfig.h:

#define configCPU_CLOCK_HZ ( SystemCoreClock )

 

Сделал поиск по configCPU_CLOCK_HZ в проекте.

 

Нашел что юзается дефайн в "__weak void vPortSetupTimerInterrupt( void )". Сделал иерархию вызова функции: portBASE_TYPE xPortStartScheduler( void ) <- void vTaskStartScheduler( void )

 

Следовательно, дефолтные настройки системного таймера применяются ровно один раз в проекте. Если вы хотите менять частоту процессора - то в том же коде перенастаивайте таймер системного тика, и будет вам счастье. Пост писал, гораздо дольше чем залез в код и нашел ответы на ваши вопросы.

Share this post


Link to post
Share on other sites
2MiklPolikov

по существу не скажу. такого опыта не имею.

ps: я смотрю на вопросы... и любопытстов всё больше и больше.... динамическое создание задач, самоудаление задач, налету изменение системного тика....

Что за проект? Что вы делаете?

 

Например разрабатываю диктофоны, которые производят Телесистемы в Зеленограде.

И другие проекты подобного характера. Иными словами, я делаю "гаджеты".

 

2MiklPolikov, фриртос - это операционка с открытым кодом.

 

Открыл свой проект, нашел в FreeRTOSConfig.h:

#define configCPU_CLOCK_HZ ( SystemCoreClock )

 

Сделал поиск по configCPU_CLOCK_HZ в проекте.

 

Нашел что юзается дефайн в "__weak void vPortSetupTimerInterrupt( void )". Сделал иерархию вызова функции: portBASE_TYPE xPortStartScheduler( void ) <- void vTaskStartScheduler( void )

 

Следовательно, дефолтные настройки системного таймера применяются ровно один раз в проекте. Если вы хотите менять частоту процессора - то в том же коде перенастаивайте таймер системного тика, и будет вам счастье. Пост писал, гораздо дольше чем залез в код и нашел ответы на ваши вопросы.

 

Да, я то же это находил.

Но подумал, вдруг есть неочевидные для меня тонкости.

Share this post


Link to post
Share on other sites

Коллеги, ещё один вопрос :

 

Верно ли я понимаю, что значение, которое возвращает xTaskGetTickCount(); периодически сбрасывается в 0 и начинает расти заново, т.к. переполняется 32х разрядная переменная, которая считает тики , и стало быть, при использовании xTaskGetTickCount(); я должен обрабатывать этот сброс в 0 ?

А все функции операционки которые работают со временем (задержка, взять симофор и т.п. ) , то же обрабатывают сброс счётчика тиков в 0 ?

 

МП

Share this post


Link to post
Share on other sites
переполняется 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.

 

 

Share this post


Link to post
Share on other sites

juvf, спасибо !

Я всегда работал со временем другим способом, и в нём приходилось проверять, не начался ли счёт с 0

 

И ещё вопрос. Правильно ли я понимаю работу ОС в целом ? :

 

В устройстве две SD карты. Задача инициализации написана одна, она создаётся в двух экземплярах, в задачу передаётся параметр № карты.

Задача вызывает какие-то функции с локальными переменными, те то же вызывают функции и т.д.

Правильно ли я понимаю, что при переключении контекста все эти локальные переменные сохраняются в стеке задачи, т.е. физически копируются из одной области памяти в другую ?

Если локальные переменные в функциях определены как static, это не влияет на сохранение в стеке ?

Получается, что на переписывание контекста в стек и обратно уходит много времени, и стало быть надо стремится сокращать количество локальных переменных ? Все большие массивы нужно определять как глобальные переменные, и работать с ними как с ресурсом ?

Share this post


Link to post
Share on other sites

я думаю что ос работает не так. есть две задачи. у каждой свой стек. локальные переменные создаются и удаляются в стеке задачи не во время переключения, а во время работы задачи, по мере необходимости.есть указатель на вершину стека. при переключении контекста локальные переменные в каждой задаче ни куда не копируются. копируется только указатель на вершину стека. Т.е. кагбэ ос переключается на др стек. Поэтому от размера стека задачи и от кол-ва локальных переменных время переключение контекста не зависит.

Share this post


Link to post
Share on other sites
juvf, спасибо !

Я всегда работал со временем другим способом, и в нём приходилось проверять, не начался ли счёт с 0

 

И ещё вопрос. Правильно ли я понимаю работу ОС в целом ? :

 

В устройстве две SD карты. Задача инициализации написана одна, она создаётся в двух экземплярах, в задачу передаётся параметр № карты.

Задача вызывает какие-то функции с локальными переменными, те то же вызывают функции и т.д.

Правильно ли я понимаю, что при переключении контекста все эти локальные переменные сохраняются в стеке задачи, т.е. физически копируются из одной области памяти в другую ?

Если локальные переменные в функциях определены как static, это не влияет на сохранение в стеке ?

Получается, что на переписывание контекста в стек и обратно уходит много времени, и стало быть надо стремится сокращать количество локальных переменных ? Все большие массивы нужно определять как глобальные переменные, и работать с ними как с ресурсом ?

По поводу переписывания контекства juvf Вам уже ответил. Контекст не переписывается, а переключается.

А вот использование static, без понимания, я бы не рекомендовал. При создании такой переменной ее экземпляр будет один и тот же на все задачи. И это может привести к печальным последствиям, если это не учитывать.

Share this post


Link to post
Share on other sites
А вот использование static, без понимания, я бы не рекомендовал. При создании такой переменной ее экземпляр будет один и тот же на все задачи.

 

Newegor, спасибо за информацию про static !

 

У меня вот это работает, только если возвращаемая переменная static . А если нет, то функция возвращает 0. Как я понимаю, это потому что существование переменной прекращаеся чуть раньше чем программа вышла из функции, и возвращать оказывается нечего.

 

char do_something(void)
{
       chatic char result;

        //.................
  
       return result;
}

Share this post


Link to post
Share on other sites

эта функция или прототип функции объявлен до вызова?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this