Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-апр-22 18:55

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 2019-фев-04 14:10 
Не в сети

Зарегистрирован: 2019-фев-04 13:07
Сообщения: 4
Дико неудобно писать сюда подобный вопрос, но выбора не остается... Очень прошу помочь и сильно не бить... Проблема в следующем: Создаю 4 задачи, каждая из которых включает светодиод. Когда заливаю прошивку, то включается только один светодиод, за работу которого отвечает первая задача. Остальные светодиоды не включаются. Код каждой задачи вот такой:

void vLed1(void *argument)
{
while(1)
{
PORT_SetBits(MDR_PORTB, PORT_Pin_0);
}
}

void vLed2(void *argument)
{
while(1)
{
PORT_SetBits(MDR_PORTB, PORT_Pin_1);
}
}

void vLed3(void *argument)
{
while(1)
{
PORT_SetBits(MDR_PORTB, PORT_Pin_2);
}
}

void vLed4(void *argument)
{
while(1)
{
PORT_SetBits(MDR_PORTB, PORT_Pin_3);
}

int main(void)
{
init ();
PORT_ResetBits(MDR_PORTB, PORT_Pin_0);
PORT_ResetBits(MDR_PORTB, PORT_Pin_1);
PORT_ResetBits(MDR_PORTB, PORT_Pin_2);
PORT_ResetBits(MDR_PORTB, PORT_Pin_3);
xTaskCreate(vLed1, "1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(vLed2, "2", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(vLed3, "3", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(vLed4, "4", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

// Run Scheduler and let's go.
vTaskStartScheduler();
}


Как только добавляю в тело каждой задачи вызов планировщика taskYIELD(), то все светодиоды включаются, это мне говорит о том, что все задачи выполнились хотя бы один раз:

while(1)
{
PORT_SetBits(MDR_PORTB, PORT_Pin_0);
taskYIELD();
}

У меня вопрос, почему когда нет функции taskYIELD(), то планировщик не доходит до других задач, что я не понимаю. Приоритет у всех задач одинаковый, режим вытесняющей многозадачности включен (#define configUSE_PREEMPTION 1). Такое ощущение, что система работает в режиме кооперативной многозадачности... Формучане, помогите, пожалуйста, ньюфагу разобраться, что не так.
P.S. Курниц и статьи про FreeRTOS прочитаны
P.P.S. ЛС тоже открыты, буду Вам очень благодарен за любые мысли по этому поводу...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-06 11:22 
Не в сети

Зарегистрирован: 2016-авг-17 12:45
Сообщения: 12
Одно предположение. Неправильно определен макрос xPortSysTickHandler в конфиге. Обычно определяют так:
Код:
#define xPortSysTickHandler  SysTick_Handler

Тогда необходимо убедится, что SysTick_Handler действительно обработчик системного таймера и он правильно настроен


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-07 11:34 
Не в сети

Зарегистрирован: 2019-фев-04 13:07
Сообщения: 4
JTzar писал(а):
Одно предположение. Неправильно определен макрос xPortSysTickHandler в конфиге. Обычно определяют так:
Код:


Макросы определены. Проверил как себя ведет система если макрос убрать - вообще не работает.
Код:

#define xPortSysTickHandler                SysTick_Handler
#define xPortPendSVHandler                   PendSV_Handler
#define vPortSVCHandler                      SVC_Handler


Добавил в задачи задержку обычным циклом, чтобы понять, как поведет себя система в этом случае:
Код:
void vLed1(void *argument)
{
   volatile uint32_t ul;

    while(1)
    {
        PORT_SetBits(MDR_PORTB, PORT_Pin_0);
            for( ul = 0; ul < 10000000; ul++ ){}
            PORT_ResetBits(MDR_PORTB, PORT_Pin_0);
            for( ul = 0; ul < 10000000; ul++ ){}
            taskYIELD();
    }
}


void vLed2(void *argument)
{
   volatile uint32_t ul;
    while(1)
    {
       PORT_SetBits(MDR_PORTB, PORT_Pin_1);
            for( ul = 0; ul < 10000000; ul++ ){}
            PORT_ResetBits(MDR_PORTB, PORT_Pin_1);
            for( ul = 0; ul < 10000000; ul++ ){}
            taskYIELD();
    }
}


void vLed3(void *argument)
{
   volatile uint32_t ul;
    while(1)
    {
        PORT_SetBits(MDR_PORTB, PORT_Pin_2);
            for( ul = 0; ul < 10000000; ul++ ){}
            PORT_ResetBits(MDR_PORTB, PORT_Pin_2);
            for( ul = 0; ul < 10000000; ul++ ){}
            taskYIELD();
    }
}


void vLed4(void *argument)
{
   volatile uint32_t ul;
    while(1)
    {
            PORT_SetBits(MDR_PORTB, PORT_Pin_3);
            for( ul = 0; ul < 10000000; ul++ ){}
            PORT_ResetBits(MDR_PORTB, PORT_Pin_3);
            for( ul = 0; ul < 10000000; ul++ ){}
            taskYIELD();
    }
}


в итоге получается следующая картина - первый светодиод мигает, далее мигает второй и так далее по кругу, что явно говорит о том, что ОС находится в режиме кооперативной многозадачности, пока все циклы не отсчитают и задача не отдаст управление, другие задачи ждут, период включения/выключения светодиодов ~1 секунда... С чем это может быть связано? Как убедиться, что системный таймер правильно настроен..?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-07 11:58 
Не в сети

Зарегистрирован: 2016-авг-17 12:45
Сообщения: 12
Настройка таймера происходит в функции vPortSetupTimerInterrupt. Провеьте, что она выполняется. А также определения макросов configCPU_CLOCK_HZ и configTICK_RATE_HZ.

Встаньте точкой останова в функции xPortSysTickHandler (Она же SysTick_Handler) для проверки частоты её вызова.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-07 12:16 
Не в сети

Зарегистрирован: 2019-фев-04 13:07
Сообщения: 4
JTzar писал(а):
Настройка таймера происходит в функции vPortSetupTimerInterrupt. Провеьте, что она выполняется. А также определения макросов configCPU_CLOCK_HZ и configTICK_RATE_HZ.


Макросы определены.
Код:
/* Here is a good place to include header files that are required across
your application. */

#define configUSE_PREEMPTION                    1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
#define configUSE_TICKLESS_IDLE                 0   
#define configCPU_CLOCK_HZ                      ( ( unsigned long ) 80000000 )
#define configTICK_RATE_HZ                      1000
#define configMAX_PRIORITIES                    5
#define configMINIMAL_STACK_SIZE                128
#define configMAX_TASK_NAME_LEN                 16
#define configUSE_16_BIT_TICKS                  0
#define configIDLE_SHOULD_YIELD                 1
#define configUSE_TASK_NOTIFICATIONS            1
#define configUSE_MUTEXES                       1
#define configUSE_RECURSIVE_MUTEXES             1
#define configUSE_COUNTING_SEMAPHORES           1
#define configUSE_ALTERNATIVE_API               0 /* Deprecated! */
#define configQUEUE_REGISTRY_SIZE               10
#define configUSE_QUEUE_SETS                    0
#define configUSE_TIME_SLICING                  0
#define configUSE_NEWLIB_REENTRANT              0
#define configENABLE_BACKWARD_COMPATIBILITY     0
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5
/* Memory allocation related definitions. */
#define configTOTAL_HEAP_SIZE                   ( ( size_t ) ( 20 * 1024 ) )
#define configAPPLICATION_ALLOCATED_HEAP        0

/* Hook function related definitions. */
#define configUSE_IDLE_HOOK                     1
#define configUSE_TICK_HOOK                     0
#define configCHECK_FOR_STACK_OVERFLOW          0
#define configUSE_MALLOC_FAILED_HOOK            0
#define configUSE_DAEMON_TASK_STARTUP_HOOK      0

/* Run time and task stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS           0
#define configUSE_TRACE_FACILITY                0
#define configUSE_STATS_FORMATTING_FUNCTIONS    0

/* Co-routine related definitions. */
#define configUSE_CO_ROUTINES                   0
#define configMAX_CO_ROUTINE_PRIORITIES         2

/* Software timer related definitions. */
#define configUSE_TIMERS                        1
#define configTIMER_TASK_PRIORITY               3
#define configTIMER_QUEUE_LENGTH                10
#define configTIMER_TASK_STACK_DEPTH            configMINIMAL_STACK_SIZE

/* Interrupt nesting behaviour configuration. */
#define configKERNEL_INTERRUPT_PRIORITY         255
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    191
#define configMAX_API_CALL_INTERRUPT_PRIORITY   15

/* FreeRTOS MPU specific definitions. */
#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0

/* Optional functions - most linkers will remove unused functions anyway. */
#define INCLUDE_vTaskPrioritySet                1
#define INCLUDE_uxTaskPriorityGet               1
#define INCLUDE_vTaskDelete                     1
#define INCLUDE_vTaskSuspend                    1
#define INCLUDE_xResumeFromISR                  1
#define INCLUDE_vTaskDelayUntil                 1
#define INCLUDE_vTaskDelay                      1
#define INCLUDE_xTaskGetSchedulerState          1
#define INCLUDE_xTaskGetCurrentTaskHandle       1
#define INCLUDE_uxTaskGetStackHighWaterMark     0
#define INCLUDE_xTaskGetIdleTaskHandle          0
#define INCLUDE_eTaskGetState                   0
#define INCLUDE_xEventGroupSetBitFromISR        1
#define INCLUDE_xTimerPendFunctionCall          0
#define INCLUDE_xTaskAbortDelay                 0
#define INCLUDE_xTaskGetHandle                  0
#define INCLUDE_xTaskResumeFromISR              1

#define xPortSysTickHandler                SysTick_Handler
#define xPortPendSVHandler                   PendSV_Handler
#define vPortSVCHandler                      SVC_Handler

/* A header file that defines trace macro can be included here. */


JTzar писал(а):
Встаньте точкой останова в функции xPortSysTickHandler (Она же SysTick_Handler) для проверки частоты её вызова.

Проверил, все работает, мк стабильно заходит в системные прерывания. Уже ломаю голову, может где то еще определено
Код:
#define configUSE_PREEMPTION
со значением 0 и система видит это определение и работает в режиме кооперативной многозадачности, хотя я проверил оба файла tasck.c и port.c, где используется условия этого макроопределения, и везде видно, что оно используется со значением 1. Может у Вас есть пустой проект с FreeRTOS и 92м камнем?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-07 15:52 
Не в сети

Зарегистрирован: 2016-авг-17 12:45
Сообщения: 12
JTzar писал(а):
Проверил, все работает, мк стабильно заходит в системные прерывания
Почему не работает - больше идей нет.

JTzar писал(а):
Может у Вас есть пустой проект с FreeRTOS и 92м камнем
Только под QtCreator. Думаю разберетесь.


Вложения:
template.zip [555.57 КБ]
Скачиваний: 52
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-08 16:40 
Не в сети

Зарегистрирован: 2019-фев-04 13:07
Сообщения: 4
у меня тоже не было больше идей, делал это на FreeRTOS 9. Снес Keil, скачал FreeRTOS 10, все пересобрал - заработало.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB