|
|
  |
Несколько вопросов начинающего |
|
|
|
Apr 30 2014, 12:56
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(Lagman @ Apr 30 2014, 15:27)  Это то что нужно ! Огромное спасибо !!! Кое-что непонятно, поясните пожалуйста : Тут 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 нужно писать самому ?
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
May 7 2014, 12:13
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(juvf @ May 7 2014, 11:43)  2MiklPolikov по существу не скажу. такого опыта не имею. ps: я смотрю на вопросы... и любопытстов всё больше и больше.... динамическое создание задач, самоудаление задач, налету изменение системного тика.... Что за проект? Что вы делаете? Например разрабатываю диктофоны, которые производят Телесистемы в Зеленограде. И другие проекты подобного характера. Иными словами, я делаю "гаджеты". Цитата(kostyan @ May 7 2014, 16:04)  2MiklPolikov, фриртос - это операционка с открытым кодом.
Открыл свой проект, нашел в FreeRTOSConfig.h: #define configCPU_CLOCK_HZ ( SystemCoreClock )
Сделал поиск по configCPU_CLOCK_HZ в проекте.
Нашел что юзается дефайн в "__weak void vPortSetupTimerInterrupt( void )". Сделал иерархию вызова функции: portBASE_TYPE xPortStartScheduler( void ) <- void vTaskStartScheduler( void )
Следовательно, дефолтные настройки системного таймера применяются ровно один раз в проекте. Если вы хотите менять частоту процессора - то в том же коде перенастаивайте таймер системного тика, и будет вам счастье. Пост писал, гораздо дольше чем залез в код и нашел ответы на ваши вопросы. Да, я то же это находил. Но подумал, вдруг есть неочевидные для меня тонкости.
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
May 27 2014, 09:01
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Коллеги, ещё один вопрос :
Верно ли я понимаю, что значение, которое возвращает xTaskGetTickCount(); периодически сбрасывается в 0 и начинает расти заново, т.к. переполняется 32х разрядная переменная, которая считает тики , и стало быть, при использовании xTaskGetTickCount(); я должен обрабатывать этот сброс в 0 ? А все функции операционки которые работают со временем (задержка, взять симофор и т.п. ) , то же обрабатывают сброс счётчика тиков в 0 ?
МП
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
May 28 2014, 00:41
|

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

|
Цитата(MiklPolikov @ May 27 2014, 19:11)  переполняется 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.
|
|
|
|
|
May 29 2014, 15:40
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
juvf, спасибо ! Я всегда работал со временем другим способом, и в нём приходилось проверять, не начался ли счёт с 0
И ещё вопрос. Правильно ли я понимаю работу ОС в целом ? :
В устройстве две SD карты. Задача инициализации написана одна, она создаётся в двух экземплярах, в задачу передаётся параметр № карты. Задача вызывает какие-то функции с локальными переменными, те то же вызывают функции и т.д. Правильно ли я понимаю, что при переключении контекста все эти локальные переменные сохраняются в стеке задачи, т.е. физически копируются из одной области памяти в другую ? Если локальные переменные в функциях определены как static, это не влияет на сохранение в стеке ? Получается, что на переписывание контекста в стек и обратно уходит много времени, и стало быть надо стремится сокращать количество локальных переменных ? Все большие массивы нужно определять как глобальные переменные, и работать с ними как с ресурсом ?
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
May 30 2014, 02:50
|
Участник

Группа: Участник
Сообщений: 71
Регистрация: 2-03-06
Из: Минск
Пользователь №: 14 879

|
Цитата(MiklPolikov @ May 29 2014, 22:50)  juvf, спасибо ! Я всегда работал со временем другим способом, и в нём приходилось проверять, не начался ли счёт с 0
И ещё вопрос. Правильно ли я понимаю работу ОС в целом ? :
В устройстве две SD карты. Задача инициализации написана одна, она создаётся в двух экземплярах, в задачу передаётся параметр № карты. Задача вызывает какие-то функции с локальными переменными, те то же вызывают функции и т.д. Правильно ли я понимаю, что при переключении контекста все эти локальные переменные сохраняются в стеке задачи, т.е. физически копируются из одной области памяти в другую ? Если локальные переменные в функциях определены как static, это не влияет на сохранение в стеке ? Получается, что на переписывание контекста в стек и обратно уходит много времени, и стало быть надо стремится сокращать количество локальных переменных ? Все большие массивы нужно определять как глобальные переменные, и работать с ними как с ресурсом ? По поводу переписывания контекства juvf Вам уже ответил. Контекст не переписывается, а переключается. А вот использование static, без понимания, я бы не рекомендовал. При создании такой переменной ее экземпляр будет один и тот же на все задачи. И это может привести к печальным последствиям, если это не учитывать.
|
|
|
|
|
May 30 2014, 04:13
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(Newegor @ May 30 2014, 11:00)  А вот использование static, без понимания, я бы не рекомендовал. При создании такой переменной ее экземпляр будет один и тот же на все задачи. Newegor, спасибо за информацию про static ! У меня вот это работает, только если возвращаемая переменная static . А если нет, то функция возвращает 0. Как я понимаю, это потому что существование переменной прекращаеся чуть раньше чем программа вышла из функции, и возвращать оказывается нечего. Код char do_something(void) { chatic char result;
//................. return result; }
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|