Freertosconfig.H Параметры редактирование

Paksoft
Пт, 03 ноября 2017 г. 10:05
Привет, чувак,

Я новичок в Freertos и изучаю книгу от Freertos. Я пытаюсь протестировать функцию Idle Crow.h (configuse_idle_hook -> 1).
Мое оборудование - STM32F103C8T6 Blue Pill от eBay, и мой код следующим образом: #include /* The task function. */ void vTaskFunction( void *pvParameters ); /* A variable that is incremented by the idle task hook function. */ static unsigned long ulIdleCycleCount = 0UL; /* Define the strings that will be passed in as the task parameters. These are defined const and off the stack to ensure they remain valid when the tasks are executing. */ const char *pcTextForTask1 = "Task 1 is running\r\n"; const char *pcTextForTask2 = "Task 2 is running\t\n"; /*-----------------------------------------------------------*/ void setup() { /* Create the first task at priority 1... */ xTaskCreate( vTaskFunction, "Task 1", 1000, (void*)pcTextForTask1, 1, NULL ); /* ... and the second task at priority 2. The priority is the second to last parameter. */ xTaskCreate( vTaskFunction, "Task 2", 1000, (void*)pcTextForTask2, 2, NULL ); /* Start the scheduler so our tasks start executing. */ vTaskStartScheduler(); for( ;; ); } void loop() {} void vTaskFunction( void *pvParameters ) { char *pcTaskName; /* The string to print out is passed in via the parameter. Cast this to a character pointer. */ pcTaskName = ( char * ) pvParameters; /* As per most tasks, this task is implemented in an infinite loop. */ for( ;; ) { /* Print out the name of this task AND the number of times ulIdleCycleCount has been incremented. */ Serial.println(pcTaskName); Serial.println(ulIdleCycleCount); /* Delay for a period. This time we use a call to vTaskDelay() which puts the task into the Blocked state until the delay period has expired. The delay period is specified in 'ticks'. */ vTaskDelay( 250 / portTICK_RATE_MS ); } } /*-----------------------------------------------------------*/ /* Idle hook functions MUST be called vApplicationIdleHook(), take no parameters, and return void. */ void vApplicationIdleHook( void ) { /* This hook function does nothing but increment a counter. */ ulIdleCycleCount++; }

Эдогальдо
Пт, 03 ноября 2017 г. 13:20
Попробуйте с: extern "C" void vApplicationIdleHook( void ) { /* This hook function does nothing but increment a counter. */ ulIdleCycleCount++; }

Paksoft
Пт, 03 ноября 2017 г., 15:16
Спасибо за быстрый ответ и полезный совет.
Он работает сейчас, поэтому внешний "C" используется для вызова функции C из C++.

Эдогальдо
Пт, 03 ноября 2017 г., 16:58
Пак, теперь у меня есть вопрос к вам: если я попробую ваш пример только с одной задачей, все работает нормально; Если вместо этого я добавляю вторую задачу, то программа висит..
Итак, вопросы:
  • Когда вы в последний раз получили код базового кода Libmaple?
  • Какую ОС вы используете?
  • Какая версия Arduino Gui и GCC Compiler вы используете?
  • Какие варианты доски и платы вы используете?
Спасибо заранее и лучше, E.

Paksoft
Сб 04 ноября 2017 г. 5:33 утра
Привет, Эдогальдо,

Спасибо за вашу помощь.

Когда вы в последний раз получили код базового кода Libmaple? -> Недавний https: // github.com/rogerclarkmelbourne/arduino_stm32
Какую ОС вы используете? -> Выиграть 10
Какая версия Arduino Gui и GCC Compiler вы используете? -> Arduino IDE V 1.6.9 и следуйте инструкциям от https: // github.com/rogerclarkmelbourne/arduino_stm32
Какие варианты доски и платы вы используете? -> STM32F103C8T6 Blue Pill от eBay

Вот мой другой рабочий код: #include #define pinLED PC13 //For STM32F103C8T6 /* The task function. */ void vTaskFunction( void *pvParameters ); /* A variable that is incremented by the idle task hook function. */ static uint32_t ulIdleCycleCount = 0UL; const char *pcTextForTask1 = "\n\rTask 1 is running, ulIdleCycleCount = "; const char *pcTextForTask2 = "\n\rTask 2 is running, ulIdleCycleCount = "; extern "C" void vApplicationIdleHook( void ) { /* This hook function does nothing but increment a counter. */ ulIdleCycleCount++; } void vTaskFunction( void *pvParameters ) { char *pcTaskName; const TickType_t xDelay250ms = pdMS_TO_TICKS( 1UL ); /* The string to print out is passed in via the parameter. Cast this to a character pointer. */ pcTaskName = ( char * ) pvParameters; /* As per most tasks, this task is implemented in an infinite loop. */ for( ;; ) { /* Print out the name of this task AND the number of times ulIdleCycleCount has been incremented. */ Serial.print(pcTaskName); Serial.print(ulIdleCycleCount); /* Delay for a period of 250 milliseconds. */ digitalWrite(pinLED, HIGH); vTaskDelay( xDelay250ms ); digitalWrite(pinLED, LOW); vTaskDelay( xDelay250ms ); } } void setup() { // initialize the digital pin as an output: pinMode(pinLED, OUTPUT); Serial.begin(921600); //For Olimex Maple // Now set up two tasks to run independently. xTaskCreate( vTaskFunction /* Pointer to the function that implements the task. */ , (const portCHAR *) "Task 1" /* Text name for the task. This is to facilitate debugging only. */ , configMINIMAL_STACK_SIZE /* Stack depth - most small microcontrollers will use much less stack than this. */ , (void*)pcTextForTask1 /* Pass the text to be printed into the task using the task parameter. */ , tskIDLE_PRIORITY + 1 /* Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.*/ , NULL );/* We are not using the task handle. */ xTaskCreate( vTaskFunction /* Pointer to the function that implements the task. */ , (const portCHAR *) "Task 2" /* Text name for the task. This is to facilitate debugging only. */ , configMINIMAL_STACK_SIZE /* Stack depth - most small microcontrollers will use much less stack than this. */ , (void*)pcTextForTask2 /* Pass the text to be printed into the task using the task parameter. */ , tskIDLE_PRIORITY + 1 /* Change priority looks at what happens*/ , NULL );/* We are not using the task handle. */ // Now the task scheduler, which takes over control of scheduling individual tasks, is automatically started. vTaskStartScheduler(); /* If all is well we will never reach here as the scheduler will now be running. If we do reach here then it is likely that there was insufficient heap available for the idle task to be created. */ for( ;; ); } void loop() { // Insert background code here }

Эдогальдо
Сб 04 ноября 2017 г. 6:26
Я обнаружил, что проблема была связана с распределенным размером стека.
Если я установите: xTaskCreate( vTaskFunction, "Task 1", 1000, (void*)pcTextForTask1, 1, NULL ); xTaskCreate( vTaskFunction, "Task 2", 1000, (void*)pcTextForTask2, 2, NULL );

Пито
Сб 04 ноября 2017 г. 9:04
Есть Freertos 9.00 в доступном репозитории..

Эдогальдо
Сб, 04 ноября 2017 г. 9:27
Та же проблема также с V 9.0

Пито
Сб 04 ноября 2017 г. 9:38 утра
Размеры стека 1000 не могут быть проблемой, я думаю..

victor_pv
Сб, 04 ноября 2017 г. 12:54
Я с Пито, что должно быть больше, чем размер стека, я использовал большие размеры стека с обоими.
Defult Config ограничен в количестве задач, количества приоритетов, минимального размера стека и т. Д. Посмотрите на файл конфигурации, чтобы увидеть, может ли какое -то значение конфигурации, которое может повлиять на вас.

Эдогальдо
Сб, 04 ноября 2017 г. 14:37
Я просто играл с эскизом Пак, используя стандартную конфигурацию Freertos, и я получил это поведение.
Может, Пак изменил что -то большее (я.эн. Некоторый параметр конфигурации или выберите метод загрузки, который, например, не управляет Maple VCP), и я пытался найти что..

Paksoft
Пн, 6 ноября 2017 г. 1:37
Я обнаружил, что проблема была связана с распределенным размером стека.
Если я установите:

Код: выберите все

xtaskCreate (vtaskfunction, "Задача 1", 1000, (void*) pctextfortask1, 1, null);
xtaskCreate (vtaskfunction, «Задача 2», 1000, (void*) pctextfortask2, 2, null);

Код разрывается, а окна даже не могут распознать серийный USB Maple.
Если вместо этого я установил:

Код: выберите все

xtaskCreate (vtaskfunction, «Задача 1», 100, (void*) pctextfortask1, 1, null);
xtaskCreate (vtaskfunction, «Задача 2», 100, (void*) pctextfortask2, 2, null);

Код работает нормально.

Так что это кажется проблемой конфликта распределения памяти..

Просто интересно, почему это не происходит с вами, так как мы используем почти одинаковую MCU (я использую Maple Mini, на самом деле).

Другой вопрос: какой метод загрузки вы используете?
Я использую Maple Bootloader 2.0
Привет, Эдогальдо,
На самом деле, я испортил код с примером из книги, мне это очень жаль.
Я пытался проверить ваш код xTaskCreate( vTaskFunction, "Task 1", 1000, (void*)pcTextForTask1, 1, NULL ); xTaskCreate( vTaskFunction, "Task 2", 1000, (void*)pcTextForTask2, 2, NULL );

Пито
Пн, 6 ноября 2017 г. 13:47
Глобальные переменные используют 11 288 байт динамической памяти. Стеки задачи приходят в кучу, вы не увидите его размера там в сообщении (эти 11 КБ являются только глобальными VARS).
Дважды проверьте, на что похож ваш размер кучи Freertos: configTOTAL_HEAP_SIZE

victor_pv
Пн, 6 ноября 2017 г. 15:37
Freertos включает в себя функции, чтобы отслеживать и сообщить, насколько полна ваш стек:
http: // www.Freertos.org/uxtaskgetstackh ... rmark.HTML


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

У меня было 1 задача, выполняя каждую N MS, отправляющую Highwtermark для каждой из других задач в серийном/USB -порту.

Также на V9 вы можете использовать статику практически для всего. Вы можете выделить свой стек задач в качестве статических переменных, таким образом, вы сообщаете его во время компиляции:
http: // www.Freertos.org/xtaskcreateStatic.HTML

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

Добавление к сообщению Пито, куча Freertos используется для всех объектов Freertos, таких как семафоры, мутекс, стеки... Таким образом, эти 8 КБ могут быстро работать в зависимости от того, что вы делаете.

Paksoft
Ср. 8 ноября 2017 г. 14:13
Привет, пито,
Спасибо за предложение. #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 120 ) #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) )

Пито
Ср. 8 ноября 2017 г. 16:54
Оптимальный размер для кучи?? Хм.
Ваш SRAM (BPILL = 20 КБ) включает в себя несколько сегментов, например
. инициализировал глобальные VAR (.данные)
. неонициализированные глобальные VARS (.BSS)
. Куча
. стек (самой ОС)..
Так что это должно соответствовать... :)