在这里插入图片描述
还有一个xPortSysTickHandler函数用于更新系统时基,我们把它放在系统滴答里,打开“gd32f30_it.c”文件,首先添加头文件与函数声明:
在这里插入图片描述
滑到最后,注释掉原有的“SVC_Handler(){}和“PendSV_Handler(){}”函数,这两个已经被上面的宏定义替换了,然后在”SysTick_Handler“中添加

		#if (INCLUDE_xTaskGetSchedulerState  == 1 )
			if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
			{
		#endif   
				xPortSysTickHandler();
		#if (INCLUDE_xTaskGetSchedulerState  == 1 )
			}
		#endif  
 class="hljs-button signin active add_def" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

编译运行0警告0错误

三、Hello FreeRTOS

1. 创建任务

任务相关使用需要包含头文件”task.h“,然后创建两个任务,一个LED灯任务一个打印任务:

//【LED任务】
//任务优先级
#define LED_TASK_PRIO				(tskIDLE_PRIORITY + 1)
//任务堆栈大小	
#define LED_STK_SIZE 		50  
//任务句柄
TaskHandle_t LEDTask_Handler;
//任务函数
void LED_Task(void *pvParameters);

//【Debug任务】
//任务优先级
#define Debug_TASK_PRIO		(tskIDLE_PRIORITY + 2)
//任务堆栈大小	
#define Debug_STK_SIZE 		512  
//任务句柄
TaskHandle_t Debug_Task_Handler;
//任务函数
void Debug_Task(void *pvParameters);
 class="hljs-button signin active add_def" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

在这里插入图片描述

然后定义一个任务创建函数:
在这里插入图片描述

/**********************************************************************************************************
* 函 数 名: RTOS_Init
* 功能说明: RTOS初始化,用于创建任务
* 形 参:无
* 返 回 值: 无
**********************************************************************************************************/
void RTOS_Init(void)
{
	taskENTER_CRITICAL();           //进入临界区
	//创建LED任务
	xTaskCreate((TaskFunction_t )LED_Task,     	
							(const char*    )"LED_task",   	
							(uint16_t       )LED_STK_SIZE, 
							(void*          )NULL,				
							(UBaseType_t    )LED_TASK_PRIO,	
							(TaskHandle_t*  )&LEDTask_Handler); 
					
	//创建Debug任务
	xTaskCreate((TaskFunction_t )Debug_Task,     	
							(const char*    )"Debug_task",   	
							(uint16_t       )Debug_STK_SIZE, 
							(void*          )NULL,				
							(UBaseType_t    )Debug_TASK_PRIO,	
							(TaskHandle_t*  )&Debug_Task_Handler); 
							
	taskEXIT_CRITICAL();            //退出临界区	
	vTaskStartScheduler();          //开启任务调度
}
 class="hljs-button signin active add_def" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

实现两个任务函数:

/**********************************************************************************************************
* 函 数 名: LED_Task
* 功能说明: LED任务
* 形  	参: 无
* 返 回 值: 无
**********************************************************************************************************/
void LED_Task(void *pvParameters)
{
    while(1)
    {
      LED_BlinkOnOff();
      vTaskDelay(500);
    }
} 
/**********************************************************************************************************
* 函 数 名: Debug_Task
* 功能说明: Debug任务
* 形  	参: 无
* 返 回 值: 无
**********************************************************************************************************/
void Debug_Task(void *pvParameters)
{
    while(1)
    {
      printf("Hello FreeRTOS\r\n");
      vTaskDelay(500);
    }
} 
 class="hljs-button signin active add_def" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

在主函数中完成调用:

int main(void)
{
    /* configure systick */
    systick_config();
		System_Init();
		RTOS_Init();
}
 class="hljs-button signin active add_def" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

在这里插入图片描述

2. 编译下载

编译下载即可看到串口打印信息以及LED周期闪烁:
在这里插入图片描述
最后附一张资源占用情况:
在这里插入图片描述


接下来大家就可以嗨皮的学习FreeRTOS的各类组件了,如果大家需要上述工程文件,公众号私信【1023】即可获取本文使用的Demo工程文件。
注:本文转载自blog.csdn.net的IOT趣制作的文章"https://blog.csdn.net/weixin_43351158/article/details/143298282"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!