历史上的今天
返回首页

历史上的今天

今天是: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、至此,任务类已建立完毕,我们可以将该任务所对应的逻辑功能都封装于一个类中,以使程序的结构更加清晰。


推荐阅读

史海拾趣

BNS Solutions公司的发展小趣事

随着电子行业的不断发展,新技术和新应用层出不穷。BNS Solutions公司紧跟时代步伐,不断加大研发投入,推动技术创新。公司团队不断探索新技术、新材料的应用,开发出了一系列具有创新性和前瞻性的电子产品。这些产品不仅提高了行业的整体技术水平,还引领了行业变革的潮流。通过持续创新,BNS Solutions公司在电子行业中保持了领先地位,成为了行业的佼佼者。

Daburn公司的发展小趣事

在Daburn公司的发展历程中,质量控制一直是重中之重。公司建立了严格的质量管理体系,从原材料采购到生产流程再到成品检验,每一个环节都严格把控。此外,Daburn还注重持续改进,通过引入先进的生产设备和工艺,不断提高产品的质量和性能。这种对质量的执着追求让Daburn赢得了客户的信任和好评。

Advanced Electronic Packaging公司的发展小趣事

Advanced Electronic Packaging公司自创立之初,便专注于电子封装技术的研发与创新。在一次关键的技术研讨会上,公司的研发团队成功突破了传统封装材料的限制,开发出了一种新型的、具有更高热导率和机械强度的封装材料。这一技术的突破,不仅提高了电子产品的性能和稳定性,还大幅降低了生产成本。凭借这一优势,Advanced Electronic Packaging公司迅速在电子封装材料市场占据了领先地位,为后续的发展奠定了坚实的基础。

Dalian Dlicap Corporation公司的发展小趣事

为了满足市场不断增长的需求,达利凯普在大连市金普新区投资建设了高端电子元器件产业化项目。该项目总用地面积4万平方米,总建筑面积5.6万平方米。项目建成后,将实现年产射频微波瓷介电容器30亿只的产能规模,进一步巩固了公司在行业内的领先地位。同时,该项目的实施也为当地经济发展注入了新的活力。

Electro-Mech Components Inc公司的发展小趣事

自1976年起,EMC在蒂华纳不仅为自身运营制造工厂,还开始为其他美国公司,如GM/Hughes Aircraft和Daneher Joslyn Sunbank Electronics提供制造服务。这种深度合作模式不仅增强了EMC的生产能力,也使其能够接触到更多的先进技术和管理经验。通过与这些美国公司的合作,EMC的产品质量和生产效率都得到了显著提升,同时也为公司的全球化战略打下了坚实基础。

国芯佳品公司的发展小趣事

1997年,EMC做出了一次重要的收购决策——从Pollak Transportation Electronics Division(TED)收购了开关灯产品线。这一收购使EMC的产品线得到了极大的扩展,同时也增强了其在电气元件领域的竞争力。收购后的开关灯产品线在EMC的精心运营下,逐渐成为了公司的明星产品之一,为公司带来了丰厚的利润。

问答坊 | AI 解惑

他妈的,老子毕业了!

本帖最后由 paulhyde 于 2014-9-15 09:34 编辑 :\'( 再见了,我的兄弟门~~~~~~  …

查看全部问答>

最全CAN_Bus资料(包括原理图,AVR,C51程序)

本帖最后由 paulhyde 于 2014-9-15 03:19 编辑 最全CAN_Bus资料 包括基于SJA1000的原理图,AVR程序,C51程序    …

查看全部问答>

菜鸟求助:wince搭建环境

各位高手,我搭建wince的开发环境已经快一个星期了,还是没成功 我只是想用visual studio 2005开发一个可以在手机上跑的程序,请问我到底要安装那些软件呀~~~…

查看全部问答>

求IPMI中文资料。200分全散!

最近要学习IPMI,看英文规范2.0看的很郁闷,哪位研究过IPMI的高人能给我发点相关资料?不胜感激!第一次发帖,200分全散! 邮箱:guohedezu@126.com…

查看全部问答>

SD 软件通讯判断有无时遇到的问题。 救急!!!

我采用软件通讯的方式去判断SD卡通讯正常还是异常,遇到一个很奇怪的现象: 如果我使用编程器下载程序,有无SD卡时均可以正常判断出来(有SD卡——下载程序——有SD程序运行正常——断电——取下SD卡——下载程序——无Sd程序运行正常); 但是如 ...…

查看全部问答>

请教版主STM32关于USB控制端点4的问题

请问版主,STM32的datasheet中标明USB控制端点是有8个的,可是现在我一使用控制端点4会出现问题,具体描述如下: 1.使用官方版本STM32_USB_FS_Device_Lib_V3.1.1中的JoyStickMouse例程,运行正常。 2.将Dvice_Table中的EP_NUM改为5,将JoySt ...…

查看全部问答>

stm8lbeep不能工作啥子原因呢?

配置完BEEP BEEP_Cmd(ENABLE); BEEP没有输出什么原因呢?…

查看全部问答>

AVR资料共享

资料共享,不收金币,共同学习,共同进步!…

查看全部问答>

头文件到底改如何用?看了网上的资料,还是不能深刻理解

我百度了一下头文件的作用如下: 1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户 提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相 ...…

查看全部问答>