历史上的今天
今天是:2025年03月08日(星期六)
2020年03月08日 | STM32开发笔记81: 在逻辑层建立任务的方法
2020-03-08 来源:eefocus
单片机型号:STM32L053R8T6
项目中应用FreeRTOS操作系统后,可以将任务单独封类,以使程序结构上更容易理解,操作更为方便简单。本文介绍在项目的逻辑层,将任务单独封类的步骤。
1、在Keil中建立2个空白文档,然后进行保存,将其保存到项目中逻辑层所对应的相应文件夹中,如下图所示,两个文件分别以.h和.cpp作为后缀。

2、将上述建立的2个文件加入到逻辑层中,如下图所示。

3、将下述样例程序加入到相应的.h文件中。
#ifndef EMBED_TASK_H_
#define EMBED_TASK_H_
#ifdef __cplusplus
extern "C"{
class CEmbedTask
{
public:
void Dispose(void);
};
}
#endif
#endif
4、将下述样例文件加入到相应的.cpp文件中。
#include "include.h"
void CEmbedTask::Dispose(void)
{
while(1)
{
Target.Delayms(10);
}
}
5、打开logic_include.h文件,加入相应的头文件,如下样例程序所示。
#ifndef LOGIC_INCLUDE_H_
#define LOGIC_INCLUDE_H_
#include "water_meter_task.h"
#include "test_task.h"
#include "net_gate_task.h"
#include "enviroment_control_task.h"
#include "embed_task.h"
#include "logic.h"
#endif
6、在logic.h文件中,声明该任务的对象。
#ifndef LOGIC_H_
#define LOGIC_H_
#include "water_meter_task.h"
#include "test_task.h"
#include "net_gate_task.h"
#include "enviroment_control_task.h"
#include "embed_task.h"
#ifdef __cplusplus
extern "C"{
class CLogic
{
public:
CWaterMeterTask WaterMeterTask;
CTestTask TestTask;
CNetGateTask NetGateTask;
CEnviromentControlTask EnviromentControlTask;
CEmbedTask EmbedTask;
};
}
#endif
#endif
7、在main函数中,声明该任务的线程ID。
osThreadId DefaultTaskHandle;
osThreadId WaterMeterTaskHandle;
osThreadId TestTaskHandle;
osThreadId NetGateTaskHandle;
osThreadId EnviromentControlTaskHandle;
osThreadId EmbedTaskHandle;
8、在main函数中,建立该任务的处理函数原型。
void StartDefaultTask(void const * argument);
void StartWaterMeterTask(void const * argument);
void StartTestTask(void const * argument);
void StartNetGateTask(void const * argument);
void StartEnviromentControlTask(void const * argument);
void StartEmbedTask(void const * argument);
9、根据项目本身的逻辑,在适当的时候,建立该任务。
if (Target.HAL.Data.DeviceType == 0x02)
{
//建立水表任务
osThreadDef(WaterMeterTask, StartWaterMeterTask, osPriorityNormal, 0, 128);
WaterMeterTaskHandle = osThreadCreate(osThread(WaterMeterTask), NULL);
}
else if (Target.HAL.Data.DeviceType == 0x03)
{
//建立环控任务
osThreadDef(EnviromentControlTask, StartEnviromentControlTask, osPriorityNormal, 0, 128);
EnviromentControlTaskHandle = osThreadCreate(osThread(EnviromentControlTask), NULL);
}
else if (Target.HAL.Data.DeviceType == 0x05)
{
//建立嵌入任务
osThreadDef(EmbedTask, StartEmbedTask, osPriorityNormal, 0, 128);
EmbedTaskHandle = osThreadCreate(osThread(EmbedTask), NULL);
}
else
{
//建立测试任务
osThreadDef(TestTask, StartTestTask, osPriorityNormal, 0, 128);
TestTaskHandle = osThreadCreate(osThread(TestTask), NULL);
}
10、任务处理函数中,调用该任务的处理函数。
void StartWaterMeterTask(void const * argument)
{
Target.Logic.WaterMeterTask.Dispose();
}
void StartTestTask(void const * argument)
{
Target.Logic.TestTask.Dispose();
}
void StartNetGateTask(void const * argument)
{
Target.Logic.NetGateTask.Dispose();
}
void StartEnviromentControlTask(void const * argument)
{
Target.Logic.EnviromentControlTask.Dispose();
}
void StartEmbedTask(void const * argument)
{
Target.Logic.EmbedTask.Dispose();
}
11、至此,任务类已建立完毕,我们可以将该任务所对应的逻辑功能都封装于一个类中,以使程序的结构更加清晰。
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 03:19 编辑 最全CAN_Bus资料 包括基于SJA1000的原理图,AVR程序,C51程序 … 查看全部问答> |
|
各位高手,我搭建wince的开发环境已经快一个星期了,还是没成功 我只是想用visual studio 2005开发一个可以在手机上跑的程序,请问我到底要安装那些软件呀~~~… 查看全部问答> |
|
最近要学习IPMI,看英文规范2.0看的很郁闷,哪位研究过IPMI的高人能给我发点相关资料?不胜感激!第一次发帖,200分全散! 邮箱:guohedezu@126.com… 查看全部问答> |
|
我采用软件通讯的方式去判断SD卡通讯正常还是异常,遇到一个很奇怪的现象: 如果我使用编程器下载程序,有无SD卡时均可以正常判断出来(有SD卡——下载程序——有SD程序运行正常——断电——取下SD卡——下载程序——无Sd程序运行正常); 但是如 ...… 查看全部问答> |
|
请问版主,STM32的datasheet中标明USB控制端点是有8个的,可是现在我一使用控制端点4会出现问题,具体描述如下: 1.使用官方版本STM32_USB_FS_Device_Lib_V3.1.1中的JoyStickMouse例程,运行正常。 2.将Dvice_Table中的EP_NUM改为5,将JoySt ...… 查看全部问答> |
|
我百度了一下头文件的作用如下: 1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户 提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相 ...… 查看全部问答> |




