天天看点

TMS570LS3137 FreeRTOS——创建任务

实验目的:将FreeRTOS移植到Hercules开发板中,并进行创建任务,通过指示灯显示看到任务状态。

实验操作:通过开发板上的LED1和D5指示灯看出当前的任务状态。

工作原理:系统先执行任务1LED1的函数,点亮LED1,然后系统延时vtaskdelay,开始调度到任务2,LED0函数中执行D5闪烁,

任务1函数,tasknum1累加到10,先执行熄灭LED1然后删除任务1。

操作步骤:

1.HCG图形化配置

1)驱动使能

TMS570LS3137 FreeRTOS——创建任务

2)het配置

HET1[0]

TMS570LS3137 FreeRTOS——创建任务

HET1[27]

TMS570LS3137 FreeRTOS——创建任务

配置完成生产代码

2.编辑CCS,sys_main.c文件

源代码如下:

/* Include Files */

#include "sys_common.h"

/* USER CODE BEGIN (1) */
#include "system.h"
#include "gio.h"
#include "het.h"
#include "FreeRTOS.h"
#include "os_task.h"
/* USER CODE END */

/** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*/

/* USER CODE BEGIN (2) */
//任务优先级
#define START_TASK_PRIO        1
//堆栈大小
#define START_STK_SIZE         128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);


#define LED0_TASK_PRIO        2

#define LED0_STK_SIZE         50

TaskHandle_t LED0Task_Handler;

void led0_task(void *pvParameters);


#define LED1_TASK_PRIO        3                         优先级最高

#define LED1_STK_SIZE         50

TaskHandle_t LED1Task_Handler;

void led1_task(void *pvParameters);

/* USER CODE END */

int main(void)
{
/* USER CODE BEGIN (3) */
    hetInit();
#if 1
    //创建任务
    xTaskCreate((TaskFunction_t )start_task,
                (const char*    )"start_task",
                (uint16_t       )START_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )START_TASK_PRIO,
                (TaskHandle_t*  )&StartTask_Handler);
 #endif
    vTaskStartScheduler();  //启动任务调度

/* USER CODE END */

    return 0;
}


/* USER CODE BEGIN (4) */
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
#if 1
    xTaskCreate((TaskFunction_t )led0_task,
                (const char*    )"led0_task",
                (uint16_t       )LED0_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )LED0_TASK_PRIO,
                (TaskHandle_t*  )&LED0Task_Handler);

    xTaskCreate((TaskFunction_t )led1_task,
                (const char*    )"led1_task",
                (uint16_t       )LED1_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);
#endif
    vTaskDelete(StartTask_Handler); //删除任务
    taskEXIT_CRITICAL();            //退出临界区
}
//任务led0
void led0_task(void *pvParameters)
{
    /* 阻塞500ms. 注:宏pdMS_TO_TICKS用于将毫秒转成节拍数,FreeRTOS V8.1.0及
              以上版本才有这个宏,如果使用低版本,可以使用500 / portTICK_RATE_MS */
    const portTickType xDelay = pdMS_TO_TICKS(500);
    while(1)
    {
        gioSetBit(hetPORT1,0,1);
        vTaskDelay(xDelay);
        gioSetBit(hetPORT1,0,0);
        vTaskDelay(xDelay);
    }
}

//任务led1
void led1_task(void *pvParameters)
{
    unsigned int task1_num = 0;
    /* 阻塞1000ms. 注:宏pdMS_TO_TICKS用于将毫秒转成节拍数,FreeRTOS V8.1.0及
              以上版本才有这个宏,如果使用低版本,可以使用1000 / portTICK_RATE_MS */
    const portTickType xDelay = pdMS_TO_TICKS(1000);
    while(1)
    {
        task1_num++;
        if(task1_num==10)
        {
            gioSetBit(hetPORT1,27,0);                                 //熄灭LED1
            vTaskDelete(LED1Task_Handler);                      //删除任务1
        }
        gioSetBit(hetPORT1,27,1);
        vTaskDelay(xDelay);

    }
}
/* USER CODE END */

           

编译链接,烧录代码到开发板中,实验成功。