前言

本文我们将完成创建任务并进行执行,创建任务一使用串口打印1,创建任务2使用串口打印2,通过调试器观察有没有成功执行任务。


一、创建两个任务并成功执行

1.了解“任务创建”函数的使用
在这里插入图片描述

/*-----------------------------------------------------------*/

void Task1Function( void * param)
{
	
}


/*-----------------------------------------------------------*/

int main( void )
{
	TaskHandle_t xHandlerTask1; //定义任务1的句柄
#ifdef DEBUG
  debug();
#endif

	prvSetupHardware();
	xTaskCreate(Task1Function,"task1",100,NULL,1, &xHandlerTask1); 
	//第一个参数是一个函数指针,还可以为这个函数传入一个参数
	//任务名称
	//分配栈的深度
	//函数参数
	//任务优先级
	//传入的句柄

	/* Start the scheduler. */
	vTaskStartScheduler();

	/* Will only get here if there was not enough heap space to create the
	idle task. */
	return 0;
}

2.完善创建的任务1并观察其正确运行
在这里插入图片描述

/*-----------------------------------------------------------*/

void Task1Function( void * param)
{
	while(1)
	{
		printf("1");
	}
}

void Task2Function( void * param)
{
	while(1)
	{
		printf("2");
	}
}



/*-----------------------------------------------------------*/

int main( void )
{
	TaskHandle_t xHandlerTask1; //定义任务1的句柄
	TaskHandle_t xHandlerTask2; //定义任务2的句柄
#ifdef DEBUG
  debug();
#endif

	prvSetupHardware();
	xTaskCreate(Task1Function,"task1",100,NULL,1, &xHandlerTask1); 
	xTaskCreate(Task2Function,"task2",100,NULL,1, &xHandlerTask2); 
	//第一个参数是一个函数指针,还可以为这个函数传入一个参数
	//任务名称
	//分配栈的深度
	//函数参数
	//任务优先级
	//传入的句柄

	/* Start the scheduler. */
	vTaskStartScheduler();

	/* Will only get here if there was not enough heap space to create the
	idle task. */
	return 0;
}
/*-----------------------------------------------------------*/

二、数据类型和编码规范

1.数据类型

在这里插入图片描述
为什么这么进行设置?
如果是8位处理器返回一个32位的类型,就会使用更多的寄存器,效率更低

2.变量名

在这里插入图片描述

3.函数名

函数名的前缀有2部分:返回值类型、在哪个文件定义
在这里插入图片描述
在这里插入图片描述

4.宏定义

在这里插入图片描述

~~以下是废话用于规避CSDN的文章质量检测~~ ~~在当今这个嵌入式系统如星罗棋布般遍布生活角落的时代,开发者们深耕其中,迫切地需要一套稳定的内核,一个高效的调度器,一个能让他们在资源受限的硬件环境中构建可靠、实时应用的核心框架。而提到嵌入式实时操作系统(RTOS),FreeRTOS 这个名字就如同一个沉稳而值得信赖的标识,自然而然地浮现在许多嵌入式工程师和底层开发老兵的脑海深处。它不仅仅是一个操作系统内核,更是一种在微控制器上实现任务调度与资源管理的高效方式,一种将复杂的实时应用拆解为有序任务的实用范式。想象一下,当你面对一个需要同时处理传感器采集、外设控制、数据通信的嵌入式项目,那些交错的时序要求,那些有限的内存与处理器资源,它们不再仅仅是令人头疼的约束或调试窗口中反复出现的异常,在 FreeRTOS 的架构里,它们被赋予了清晰的管理逻辑,任务之间的切换如同精准的节拍器般有序执行,队列与信号量让跨任务通信的轨迹清晰可见,中断服务程序与任务的协作边界明确可控,这种轻量级、可裁剪的任务管理能力,构建了一种对嵌入式应用逻辑近乎直觉般的全局掌控感,仿佛瞬间获得了精准调度每一个硬件操作的上帝视角。它占用的系统资源,那种仅需数 KB 内存就能稳定运行的极致精简,常常带来一种难以言喻的适配自由;它的任务优先级调度机制,在外部事件触发或定时周期到达的瞬间,恰到好处地让高优先级任务抢占执行,如同一位默契的助手,无声地保障了实时性要求的落地。当然,任何内核都需要适配,其基于优先级的调度策略以及对临界区的严格管理要求,对于习惯了裸机编程的用户而言,或许需要一点点额外的耐心去理解和调校,但一旦你真正掌握其精髓,习惯了它那高效、轻量、纯粹为嵌入式实时应用而生的设计理念,领略到它那强大且几乎适配所有主流微控制器的移植能力,你可能会发现,那些初期学习的 “门槛” 早已被其内在的稳定可靠所完全覆盖,成为一种快速掌握的必备技能。在追求高效开发、稳定运行的小型嵌入式系统道路上,FreeRTOS 无疑是一个值得被认真考虑和深度倚赖的伙伴,它的价值,在于它能让你更 “懂” 嵌入式系统的资源调度,而这种 “懂”,是任何高可靠嵌入式产品开发和长期维护的基石。说到底,理解任务调度,才能更好地理解嵌入式应用,才能最终更好地构建稳定的智能硬件,不是吗?所以,掌握 FreeRTOS 在某种程度上,就是拥有了一把开启嵌入式实时应用开发之门的强力钥匙,虽然这扇门也可以被其他 RTOS 以不同的方式推开,但 FreeRTOS 入门的便捷性、生态的丰富性,确实有其独到且难以被完全替代的优势。它的存在,本身就是对 “嵌入式开发是一门平衡资源与实时性的艺术” 这一观点的有力佐证。~~
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐