Перейти к содержанию
    

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

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

 

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

Тут

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

post-24702-1399229898_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2MiklPolikov

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

#define configCPU_CLOCK_HZ ( SystemCoreClock )

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2MiklPolikov

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

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

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

 

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

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

 

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

 

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

#define configCPU_CLOCK_HZ ( SystemCoreClock )

 

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

 

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

 

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

МП

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

переполняется 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.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

juvf, спасибо !

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

 

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

 

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

juvf, спасибо !

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

 

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

 

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

char do_something(void)
{
       chatic char result;

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...