реклама на сайте
подробности

 
 
7 страниц V  « < 3 4 5 6 7 >  
Reply to this topicStart new topic
> Несколько вопросов начинающего
Lagman
сообщение Apr 30 2014, 11:27
Сообщение #61


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



http://www.freertos.org/low-power-tickless-rtos.html
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Apr 30 2014, 12:56
Сообщение #62


Гуру
******

Группа: Свой
Сообщений: 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 нужно писать самому ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Lagman
сообщение Apr 30 2014, 18:08
Сообщение #63


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Я сильно не вникал т.к. не использую режимы энергосбережения, но из написанного на оф.сайте я понял, что если для процессора есть пример с энергосбережением то можно его использовать или написать свою ф-ю.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение May 4 2014, 18:54
Сообщение #64


Гуру
******

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



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


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение May 6 2014, 16:53
Сообщение #65


Гуру
******

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



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

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


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
juvf
сообщение May 7 2014, 07:43
Сообщение #66


Профессионал
*****

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



2MiklPolikov
по существу не скажу. такого опыта не имею.
ps: я смотрю на вопросы... и любопытстов всё больше и больше.... динамическое создание задач, самоудаление задач, налету изменение системного тика....
Что за проект? Что вы делаете?
Go to the top of the page
 
+Quote Post
kostyan
сообщение May 7 2014, 12:04
Сообщение #67


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



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

Открыл свой проект, нашел в FreeRTOSConfig.h:
#define configCPU_CLOCK_HZ ( SystemCoreClock )

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

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

Следовательно, дефолтные настройки системного таймера применяются ровно один раз в проекте. Если вы хотите менять частоту процессора - то в том же коде перенастаивайте таймер системного тика, и будет вам счастье. Пост писал, гораздо дольше чем залез в код и нашел ответы на ваши вопросы.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение May 7 2014, 12:13
Сообщение #68


Гуру
******

Группа: Свой
Сообщений: 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 )

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


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


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение May 27 2014, 09:01
Сообщение #69


Гуру
******

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



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

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

МП


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
juvf
сообщение May 28 2014, 00:41
Сообщение #70


Профессионал
*****

Группа: Свой
Сообщений: 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.

Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение May 29 2014, 15:40
Сообщение #71


Гуру
******

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



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

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

В устройстве две SD карты. Задача инициализации написана одна, она создаётся в двух экземплярах, в задачу передаётся параметр № карты.
Задача вызывает какие-то функции с локальными переменными, те то же вызывают функции и т.д.
Правильно ли я понимаю, что при переключении контекста все эти локальные переменные сохраняются в стеке задачи, т.е. физически копируются из одной области памяти в другую ?
Если локальные переменные в функциях определены как static, это не влияет на сохранение в стеке ?
Получается, что на переписывание контекста в стек и обратно уходит много времени, и стало быть надо стремится сокращать количество локальных переменных ? Все большие массивы нужно определять как глобальные переменные, и работать с ними как с ресурсом ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
juvf
сообщение May 30 2014, 00:37
Сообщение #72


Профессионал
*****

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



я думаю что ос работает не так. есть две задачи. у каждой свой стек. локальные переменные создаются и удаляются в стеке задачи не во время переключения, а во время работы задачи, по мере необходимости.есть указатель на вершину стека. при переключении контекста локальные переменные в каждой задаче ни куда не копируются. копируется только указатель на вершину стека. Т.е. кагбэ ос переключается на др стек. Поэтому от размера стека задачи и от кол-ва локальных переменных время переключение контекста не зависит.
Go to the top of the page
 
+Quote Post
Newegor
сообщение May 30 2014, 02:50
Сообщение #73


Участник
*

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



Цитата(MiklPolikov @ May 29 2014, 22:50) *
juvf, спасибо !
Я всегда работал со временем другим способом, и в нём приходилось проверять, не начался ли счёт с 0

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

В устройстве две SD карты. Задача инициализации написана одна, она создаётся в двух экземплярах, в задачу передаётся параметр № карты.
Задача вызывает какие-то функции с локальными переменными, те то же вызывают функции и т.д.
Правильно ли я понимаю, что при переключении контекста все эти локальные переменные сохраняются в стеке задачи, т.е. физически копируются из одной области памяти в другую ?
Если локальные переменные в функциях определены как static, это не влияет на сохранение в стеке ?
Получается, что на переписывание контекста в стек и обратно уходит много времени, и стало быть надо стремится сокращать количество локальных переменных ? Все большие массивы нужно определять как глобальные переменные, и работать с ними как с ресурсом ?

По поводу переписывания контекства juvf Вам уже ответил. Контекст не переписывается, а переключается.
А вот использование static, без понимания, я бы не рекомендовал. При создании такой переменной ее экземпляр будет один и тот же на все задачи. И это может привести к печальным последствиям, если это не учитывать.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение May 30 2014, 04:13
Сообщение #74


Гуру
******

Группа: Свой
Сообщений: 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;
}


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Lagman
сообщение May 30 2014, 05:19
Сообщение #75


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



эта функция или прототип функции объявлен до вызова?
Go to the top of the page
 
+Quote Post

7 страниц V  « < 3 4 5 6 7 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01546 секунд с 7
ELECTRONIX ©2004-2016