实验目的:将FreeRTOS移植到Hercules开发板中,并进行创建任务,通过指示灯显示看到任务状态。
实验操作:通过开发板上的LED1和D5指示灯看出当前的任务状态。
工作原理:系统先执行任务1LED1的函数,点亮LED1,然后系统延时vtaskdelay,开始调度到任务2,LED0函数中执行D5闪烁,
任务1函数,tasknum1累加到10,先执行熄灭LED1然后删除任务1。
操作步骤:
1.HCG图形化配置
1)驱动使能
2)het配置
HET1[0]
HET1[27]
配置完成生产代码
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 */
编译链接,烧录代码到开发板中,实验成功。