基于此系列文章1:C++抽象化封装FreeRTOS,一种多人并行开发方案1

此文章介绍提供的API以及多人并行开发方案

API函数

介绍一下,我封装的基础的API函数

	void vdelete(); /* 删除任务 */
	void vSuspend();//挂起任务
	void vResume();//恢复任务
	eTaskState eGetState();//状态查询
	unsigned portBASE_TYPE uxGetWater();//获取高水位值
	TaskHandle_t getHandle();/* 获取句柄 */

就以mainTask任务为例子吧,我们在defultTask中对其操作,注意,不要在mainTask()中对

mainTask操作,因为调用发生在对象mainTask之前,在c语言中,还未创建就调用是会报错的,同样,mainTask还未创建就在Main_Task 中调用是错误的,错误例子

class Main_Task:public TaskBase{
public:
Main_Task():TaskBase("main_task",32,1){};
virtual void task(void*arg)
{
    while(1)
    {
		maintask.getHandle();
		vTaskDelay(pdMS_TO_TICKS(100));
    }
}	
};
Main_Task maintask;

对比成c语言结构体的错误就是

struct Main_Task
{
    mainTask.xxx;//mainTask此可还未实现
};
struct Main_Task mainTask;//mainTask在此刻实现

通过以下API对任务进行操作,一些对任务的操作也不用去找了,直接“.”点一下就能引出,使用方法与freeRTOS原API一样,不过更简洁一些,省去了找参数填参数的步骤。

class Default_Task:public TaskBase{
public:
Default_Task():TaskBase("default_Task",128,1){};
virtual void task(void*arg)
{
	//获取任务句柄
	TaskHandle_t main_handle = maintask.getHandle();
	//查看任务内存使用情况(高水位置)
	unsigned portBASE_TYPE main_water = maintask.uxGetWater();
	//挂起任务
	maintask.vSuspend();
	//恢复任务
	maintask.vResume();
	//查询任务状态
	eTaskState main_state = maintask.eGetState();
	//删除任务
	maintask.vdelete();
    while(1)
    {
		vTaskDelay(pdMS_TO_TICKS(100));
    }
}	
};
Default_Task defaultTask;

多人并行

因为freeRTOS的隔离属性,你将对象创建在全局区,还未调用主函数时,任务已创建好,这时候在主函数中使用任务调度器直接就启动了,我举个例子,在这里,我将任务写在"my.cpp",你是小红你在分组创建一个xiaohong.cpp,他是小军,他创建一个“xiaojun.cpp”,这样,你们两人的文件就是隔离的,业务逻辑找起来就会通常许多,谁写的业务逻辑去谁的文件看就好了,不过要注意,写好的c驱动文件要要兼容c++哦,不然用于c++文件就会找不到函数名称了,这方法面博客有许多文章的。或者直接看我的stm32f系列兼容c++的方案文章好了

如果要多文件通信的话,那就创建一个公共文件common.c,common.h(名字随意)好了,在里面修改,读取变量信息,在各自的“xiaojun.cpp”,"xiaohong.cpp"引入头文件“common.h”就好了

我会在下一章讲解源码

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐