历史上的今天
返回首页

历史上的今天

今天是:2024年12月13日(星期五)

正在发生

2021年12月13日 | 关于STM32的裸机多任务多线程心得

2021-12-13 来源:eefocus

多任务"并行处理"

首先我们来理解一下并行处理,初学者写程序通常是顺序执行,当我们逐渐想成为“专业”人士的时候顺序执行 的程序已经不能满足我们了,所以就需要多任务多线程系统,市面上标准的一些操作系统比如ucos,freeRTOS这些操作系统需要的学习周期长,范围广。在网上看到了一本书"单片机编程魔法师之高级裸编思想"在没学会ucos的阶段学习用这种思想过度感觉非常nice!


单片机是支持多任务同时并行地运行在一个系统中,在具体介绍之前先看一看单片机的硬件结构

在这里插入图片描述

这个图中我们可以看出,单片机的运行是在ALU的主导下进行的;而定时器指是一个定时装置,它在定时计数期间是无需ALU干预的,完全独立运行;串口的通讯单元对数据的接收与发送也是完全独立完成的,并不需要ALU干预。很显然这三个任务是并行处理,切互不干涉,只有在定时器或串口产生中断时才会到代码中临时运行一段程序,已向单片机的主体运行过程交付一下结果,以便进行汇总处理。


微操作系统

简单一点来说就是一个while(1)但是while中我们采用多任务多线程的方式管理。首先我们要知道任务有生死,生死是一个过程所以具有寿命。


一个任务的线程:假设一个任务的执行代码有50步,通常编程只会一次执行完毕,但是我们现在需要想想,因为我们会嫌这个任务总占用着ALU的时间而影响其他任务的执行效果,所以就可以对任务进行划分,把它分为5份,每份10步,这样我们每次执行其中的一个程序片–每次正在运行的程序片我们称为线程。

在这里插入图片描述

这个图很完美的解释了线程的运行原理。


具体线程的实现:


typedef struct{

u8 isTask_Living;

u8 Thread_Process;

}myTask;

void Task(void)

{

if(Task.isTask_Living)

{

Task.isTask_Living = !myThread3(&Task3,&Task3.Thread_Process);

}

}

/*初始化任务变量*/

void InitTask4(myTask4 *Task)

{

Task->isTask_Living=1;

Task->Thread_Process=0;

}


/*功能:任务线程

**参数:myTask:Task任务类型

**   :Process:unsigned char*类型,线程指针

**返回值:CHAR类型,线程结束,或未结束

*/

static int myThread(myTask *Task,unsigned char *Process)

{

int ret=0;

switch(*Process)

{

case 0:

//程序片1

break;

case 1:

//程序片2

break;

case 2:

//程序编3

break;

default:break;

}

(*Process)++;

if(*Process>3)

{

ret = -1;

*Process = 0;

}

return ret;

}


void TaskCommunication(void)

{

if(Task.isTask_Living)

{

Task.isTask_Living = !myThread(&Task4,&Task4.Thread_Process);

}

}

在这里插入图片描述
在这里插入图片描述

真正多任务处理的过程:

在这里插入图片描述

仔细理解图上的内容对写多任务程序的结构很有好处。

加油吧骚年们!

推荐阅读

史海拾趣

Cables To Go公司的发展小趣事

随着电子设备的普及和互联网的发展,Cables To Go公司看到了巨大的市场潜力。公司积极拓展销售渠道,通过线上电商平台和线下实体店相结合的方式,将产品销往全国各地。此外,公司还积极开拓国际市场,与多个国家和地区的代理商建立了合作关系,进一步扩大了市场份额。这种跨越式的市场拓展策略为公司的快速发展奠定了坚实的基础。

ECS公司的发展小趣事

ECS公司成立于XXXX年,由一群热衷于云计算技术的工程师创立。在创立初期,公司就明确了以提供高效、弹性的云服务为目标。他们深入研究了虚拟化技术、自动化管理等关键技术,成功推出了ECS服务,为客户提供按需分配的计算资源。这一创新的服务模式迅速吸引了众多客户的关注,ECS公司开始在云服务市场崭露头角。

Belden Wire & Cable公司的发展小趣事

为了进一步扩大市场份额,Belden公司开始实施全球扩张战略。公司先后在多个国家和地区设立了分支机构,将优质的产品和服务带到了世界各地。此外,Belden还积极寻求与其他知名企业的战略合作,通过强强联合,共同推动电线电缆行业的发展。这些合作不仅为Belden带来了更多的商业机会,还提升了公司在全球市场的竞争力。

Falco Electronics公司的发展小趣事

Falco Electronics始终将产品质量放在首位。公司建立了严格的质量控制体系,从原材料采购到产品生产,每一个环节都严格把关。这种对质量的坚持让Falco Electronics的产品在市场上赢得了良好的口碑。越来越多的客户选择Falco Electronics的产品,公司的市场份额也逐渐扩大。

Electronic Transistors Corp公司的发展小趣事

ETC公司非常重视团队建设和文化塑造。公司注重培养员工的创新能力和团队协作精神,为员工提供广阔的发展空间和良好的职业前景。同时,ETC还积极营造积极向上、开放包容的企业文化,使员工能够在轻松愉悦的氛围中工作和学习。这些举措不仅提高了员工的满意度和忠诚度,也为公司的长期发展奠定了坚实的基础。

南京绿芯(Grenergy)公司的发展小趣事

作为一家领先的电子企业,ETC公司深知自身肩负的社会责任。公司积极履行社会责任,关注环境保护和资源节约。ETC通过引进先进的生产工艺和设备,减少生产过程中的能源消耗和废弃物排放。同时,公司还积极参与公益事业和社会活动,为社会做出了积极贡献。这些举措不仅提升了ETC的企业形象,也为公司的可持续发展奠定了坚实的基础。

问答坊 | AI 解惑

Palm软件设计前的六问

当我屁颠屁颠地跟在老师后面不厌其烦询问如何编写某个程序的时候,老师总是对我说先画出你程序的 控制流程序图吧。当时觉得麻烦,也就把这经验之谈当成了一阵风吹过。现在,走上了程序开发这条路 ,才知道开发之前系统的规化一下自已的思路是 ...…

查看全部问答>

祝大家牛年牛气冲天

万事如意,芝麻开花节节高…

查看全部问答>

网络摄像头的巧妙用途

关键字:网络摄像头       网络摄像头因其体积小、重量轻、耗电省安装使用方便、价格低廉等优点,近年来在可视门铃、公共场所图像监视方面得到广泛应用。     目前,市场上价位较低的CCD黑白网络摄像头仅一百余元,而价位 ...…

查看全部问答>

集成电路测试方法

在传统的IC设计中,每一个电路的设计几乎都是从零开始,所谓的复用也仅仅局限于标准单元库中的基本逻辑门。这种设计风格正在逐渐被一种新的设计风格所取代,即所谓的基于IP设计的方法。这些被称为IP核的内核可能是规模巨大的,例如CPU、DSP、Memory ...…

查看全部问答>

两篇忆阻器论文的阅读梗概(不专业,欢迎拍砖)

星期五和琳子姐搞定了 忆阻器 的专题。       晚上打开看了看,发现还有一些东西忘了放上去。       内容如标题所言。       其实,这也是做这个专题花费时间最多的部分:阅读两篇 ...…

查看全部问答>

在CE下怎么获取当前的网络类型??

想通过API程序来获取当前手机连接的网络类型,比如是GPRS,还是edwg,还是3G,还是CDMA等?? 谢谢啦…

查看全部问答>

jave web start 怎么用如何设置

呵呵,我做了一个实验 室视频监控系统设计, 在 最后观看时 发现,在上位机上用 techview.exe 观看时可以看到视频图像,但是在IE浏览栏里输入我的ARM板的IP时(我已经安装了Java Web Start 软件),按说应该可以查看图像啦,可是网页却无法显示,这 ...…

查看全部问答>

电压检测电路求指正

公司产品的检测作业。 Vin是输入电压,要求范围在1.8到2.4V之间,我设计了一个电路 如果不在范围内就报警,处女作求高手指点,应该注意些什么?   VCC采用DC power 比较器采用LM358系列的可不可以? 谢谢回复    …

查看全部问答>

有用过AD9834的吗

我按ad9834datasheet的电路图焊接了一块电路但写入程序后发波  但是不住么 相差太大,程序没问题…

查看全部问答>

【MSP430共享】挺不错的学习心经

MSP430学习心经(一)ClockMSP430根据型号的不同最多可以选择使用3个振荡器。我们可以根据需要选择合适的振荡频率,并可以在不需要时随时关闭振荡器,以节省功耗。这3个振荡器分别为:(1)DCO    数控RC振荡器。它在芯片内部,不用时可 ...…

查看全部问答>