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

 
 
7 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Несколько вопросов начинающего
MiklPolikov
сообщение Dec 21 2013, 17:32
Сообщение #16


Гуру
******

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



Объясните, как подружить FREERTOS и STM32F030 ?

Взял FreeRTOSConfig.h , который компилировался с STM32L151 .
Не компилируется. ругается на ассемблерные вставки в port.c " error: A1874E: Specified register list cannot be loaded or stored in target instruction set" и другие подобные ошибки.
Взял FreeRTOSConfig.h из демо проекта STM32F05 IAR. У меня keil . Не компилируется. Да и этот файл сильно отличается от моего , наверно потому что он для Iar.

Направьте меня пожалуйста в нужную сторону.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 21 2013, 22:16
Сообщение #17


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(MiklPolikov @ Dec 21 2013, 21:32) *
...ругается на ассемблерные вставки в port.c...


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

За одно и поучитесь и ошики подправите во фриртос - они там немного существуют...
Go to the top of the page
 
+Quote Post
juvf
сообщение Dec 22 2013, 07:10
Сообщение #18


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

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



Цитата(MiklPolikov @ Dec 21 2013, 22:32) *
Взял FreeRTOSConfig.h из демо проекта STM32F05 IAR. У меня keil . Не компилируется. Да и этот файл сильно отличается от моего , наверно потому что он для Iar.

Направьте меня пожалуйста в нужную сторону.

а от куда взял port.c? Для кортексаМ0 с кейлом порт нужно брать от сюда FreeRTOS\Source\portable\RVDS\ARM_CM0
а FreeRTOSConfig.h ... может этот подойдёт FreeRTOS\Demo\CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC\FreeRTOSConfig.h
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Dec 22 2013, 13:49
Сообщение #19


Гуру
******

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



juvf , спасибо, получилось. Моя проблема была в том что в версии 7.4.0 скаченной несколько месяцев назад вообще не было папки ARM_CM0


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Dec 23 2013, 10:38
Сообщение #20


Гуру
******

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



Вопрос про удаление задач.
Как это организовать правильно, или правильно ли я вообще подхожу к созданию алгоритма ?

Есть 3 задачи v_Task1, Vtask2, Vtask3.
В любой момент времени может потребоваться создать любую задачу , или может потребоваться любую удалить.
Если задача создаётся, то нужно во-первых быть уверенным что она уже не создана(а что будет если создать заново той же самой командой ?), а во-вторых удалить две другие задачи.

Делаю так :
В начале задачи v_Task1 пишу

Код
if(v_Task2_Handle!=NULL)
      vTaskDelete(&v_Task2_Handle);
if(v_Task3_Handle!=NULL)
      vTaskDelete(&v_Task3_Handle);


аналогично в остальных задачах.

Но вот беда : если переключение контекста произойдёт после проверки условия v_Task2_Handle ! = NULL , задача v_Task2 где-то удалится, а потом программа вернётся в Task1 и снова попытается удалить уже удалённую задачу, то Task1 удалит сама себя, т.к. v_Task2_Handle уже == NUL

Задачи хочу именно удалять для экономии стека. да и запускать их надо каждый раз с начала.

Вопрос: как это сделать по-человечески ?


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


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

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



Цитата(MiklPolikov @ Dec 23 2013, 16:38) *
Но вот беда : если переключение контекста произойдёт после проверки условия v_Task2_Handle ! = NULL , задача v_Task2 где-то удалится, а потом программа вернётся в Task1 и снова попытается удалить уже удалённую задачу, то Task1 удалит сама себя, т.к. v_Task2_Handle уже == NUL

Дак а критические секции? Остановка планировщика?

см taskCRITICAL_ENTER(), taskCRITICAL_EXIT(), vTaskSuspendAll(), xTaskResumeAll();
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Dec 23 2013, 16:00
Сообщение #22


Гуру
******

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



juvf, спасибо !

У меня ещё вопрос .
В документации пишут, что vTaskDelay не освобождает память. занятую задачей память нужно освободить как-то вручную, до вызова vTaskDelay.
За примером отсылают к death.c
https://code.google.com/p/freertos-atmega32...ull/death.c?r=2
Смотрю на код, и не понимаю, где там освобождается память ? По-моему просто вызывается vTaskDelay.
И вообще, как можно освободить память задачи, которая ещё не удалена ? Ведь если не удалена, значит ещё работает .



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


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

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



не путай vTaskDelay и vTaskDelete.

vTaskDelay - не удаляет задачу, а задерживает.

Про зачистку памяти.....
Цитата
Замечание: idle задача ответственна за освобождение выделенной памяти задач, которые были удалены. Поэтому важно, чтобы idle задача имела микроконтроллерное время на работу, если ваше приложение делает какие-нибудь вызовы vTaskDelete (). Память, выделенная коду задачи автоматически не освобождается, и должна быть освобождена прежде, чем задача будет удалена.


Ту память, которую занимала прибитая задача, зачистит idle. А ту память которую выделили задаче до создания задачи, нужно руками зачищать.

например death.c
Код
void vCreateSuicidalTasks( unsigned portBASE_TYPE uxPriority )
{
unsigned portBASE_TYPE *puxPriority;

        /* Create the Creator tasks - passing in as a parameter the priority at which
        the suicidal tasks should be created. */
        puxPriority = ( unsigned portBASE_TYPE * ) pvPortMalloc( sizeof( unsigned portBASE_TYPE ) );
        *puxPriority = uxPriority;

        xTaskCreate( vCreateTasks, "CREATOR", deathSTACK_SIZE, ( void * ) puxPriority, uxPriority, NULL );

        /* Record the number of tasks that are running now so we know if any of the
        suicidal tasks have failed to be killed. */
        uxTasksRunningAtStart = uxTaskGetNumberOfTasks();
}

Если задача vCreateTasks сама себя удалит, или её удалит кто-то другой, то память, веделенная вызовом pvPortMalloc не освободится. Нужно позаботится об её освобождении. Поэтому в задаче vCreateTasks делается ручная зачистка

Код
unsigned portBASE_TYPE uxPriority; //создается новая переменная на стеке
...

        uxPriority = *( unsigned portBASE_TYPE * ) pvParameters; //копируется данные из динамической выделенной памяти pvParameters в uxPriority
        vPortFree( pvParameters ); //удаляется динамически выделенная память.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Dec 24 2013, 02:29
Сообщение #24


Гуру
******

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



juvf, огромное спасибо !!!

Наблюдения :
Разбирался с переполнением стека. vApplicationStackOverflowHook иногда работает, иногда нет.
А если вставить вот такую функцию-заглушку перед каждым созданием новой задачи, она даст 100% верный результат.
vTaskDelay(1); нужен для того что бы запустить Idle Task которая память освободит если этого ещё не случилось после удаления задач.
В худшем случае программа просто зацыклится внутри этой функции, и я буду точно знать в какой момент память кончилась.


Код
//функция- костыль
//////////////////////////////////////
void CHECK_FREE_MEMORY(void)
{
    xxx=xPortGetFreeHeapSize();
    while(xxx<256)
    {
        xxx=xPortGetFreeHeapSize();
        vTaskDelay(1);
    }    
}


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
juvf
сообщение Dec 24 2013, 03:20
Сообщение #25


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

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



Цитата(MiklPolikov @ Dec 24 2013, 07:29) *
vApplicationStackOverflowHook иногда работает, иногда нет.

У vApplicationStackOverflowHook есть два режима. см КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 11 '2011, стр 104, "Контроль переполнения стерка". Пробуй Метод контроля переполнения стека № 2.

Ну и как я понял проблема в том, что не хватает памяти в общем стеке для создания новой задачи. А vApplicationStackOverflowHook контролирует переполнение стека не общего, а стека задачи самой задачей.

Цитата
А если вставить вот такую функцию-заглушку перед каждым созданием новой задачи, она даст 100% верный результат.

ээээ..... не совсем понятно что делает заглушка? Проверяет есть ли 256 байт или 256*size_t байт доступно в общем стеке? Не нашол описание на xPortGetFreeHeapSize().
какую модель памяти используешь?
на оф сайте
Цитата
The xPortGetFreeHeapSize() API function returns the total amount of heap space that remains unallocated (allowing the configTOTAL_HEAP_SIZE setting to be optimised), but does not provided information on how the unallocated memory is fragmented into smaller blocks.
Т.е. у тебя может быть в общей куче 500 байт свободно, 50 блоков по 10 байт. ни одну новую задачу создать не возможно. Память фрагментирована. Твой костыль тут не поможет.

Поможет возвращяемое значение xTaskCreate()
Цитата
Возвращает:
pdPASS - если задача успешно создана и добавлена в список готовых, иначе возвращает код ошибки, определенный в файле errors. h
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jan 6 2014, 00:32
Сообщение #26


Гуру
******

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



Стало любопытно, каким образом память становится фрагментирована на куски по 10 байт ? После того как была удалена задача со стеком 60 байт, и создана новая задача со стеком 50 , стек которой заполнил освободившуюся "дырку"?
А она потом сама автоматически дефрагментируется ? Возможно для этого необходимо уходить в задачу idle , так же как и для освобождение памяти после удаления задачи ?


Цитата(juvf @ Dec 24 2013, 07:20) *
Т.е. у тебя может быть в общей куче 500 байт свободно, 50 блоков по 10 байт. ни одну новую задачу создать не возможно. Память фрагментирована. Твой костыль тут не поможет.



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


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

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



Цитата(MiklPolikov @ Jan 6 2014, 05:32) *
Стало любопытно, каким образом память становится фрагментирована на куски по 10 байт ? После того как была удалена задача со стеком 60 байт, и создана новая задача со стеком 50 , стек которой заполнил освободившуюся "дырку"?
Да

Цитата
А она потом сама автоматически дефрагментируется ?
Нет

Дружище..... тебя уже не раз отсылали к статьям Курниц. Там же ответы на все твои вопросы. На русском разжовано и с картинками выложенно.
По поводу фрагментации памяти см КиТ №5 2011 стр 99. Там не совсем свежее описание, нет модели 4, но 1-3 модели описанны хорошо.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jan 6 2014, 08:12
Сообщение #28


Гуру
******

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



Цитата(juvf @ Jan 6 2014, 10:57) *
Дружище..... тебя уже не раз отсылали к статьям Курниц. Там же ответы на все твои вопросы. На русском разжовано и с картинками выложенно.
По поводу фрагментации памяти см КиТ №5 2011 стр 99. Там не совсем свежее описание, нет модели 4, но 1-3 модели описанны хорошо.

Конечно же я их прочитал. И не только их. Ну всего же не запомнишь...


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


Гуру
******

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



У меня новый вопрос.
Правильно ли я отдаю симафор из прерывания и переключаю в нём контекст ?
Такая проблема : работает, но через 5 минут(точной привязки ко времени нет) начинает работать неправильно. Остальные задачи начинают тормозить, будто бы задача забирающая симафор
vRTC_Read_Time_Task начала использовать всё машинное время. Второй день не могу даже точно понять что происходит .
Заранее спасибо !!!

Код
////////////////////////////читаем время из RTC сразу после выдачи симафора из ежесекундного прерывания//////////////////////////////////////
void vRTC_Read_Time_Task (void * pvParameters)
{    
  while(1)
  {
        xSemaphoreTake( x_RTC_Second_Change, portMAX_DELAY );
    /*
        .....................
     */
  }


///////прерывание RTC  ALARM  1 раз в секунду////////////////////////////////////////////////
void RTC_Alarm_IRQHandler(void)
{
     portBASE_TYPE pxHigherPriorityTaskWoken;
    
      EXTI->PR|=(1<<17);
      RTC->ISR&=~RTC_ISR_ALRAF;    //сбрасываем флаги прерывания
    
      xSemaphoreGiveFromISR(x_RTC_Second_Change,&pxHigherPriorityTaskWoken);
      if(pxHigherPriorityTaskWoken==pdTRUE)
            taskYIELD(); //переключаем контекст
}


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


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(MiklPolikov @ Jan 6 2014, 18:44) *
...Правильно ли я отдаю симафор из прерывания и переключаю в нём контекст ?...


в коде подвоха не видно.
привидите пример создания этого семафора, ну и обратите на это внимание собственно sm.gif
Go to the top of the page
 
+Quote Post

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

 


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


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