网易首页 > 网易号 > 正文 申请入驻

单片机裸机代码框架设计思路(四)

0
分享至

前面的文章讲述了裸机代码的4种写法

(1)轮询系统

(2)前后台系统

(3)基于时间片

(4)基于单向链表

这一篇文章我再扩展一点,大家可以看出,第二种写法比较通俗易懂,但是如果添加很多任务,修改的地方较多,第三种和第四种就非常不错,改动的地方比较少。

基于时间片裸机系统和基于链表的裸机系统,虽然一个是用数组来实现的,一个是用链表来实现的,可以看出基于链表的裸机代码更加全面,主要体现在如下几点

1.task_ticks的心跳自加变量,直接放在定时器中断里,作为时基,和判断是否要执行的任务其他代码都有剥离开来,更加容易维护。

2.可以自由的启动任务和停止任务。

3.可以单次触发,也就是只是执行一次。

如果上述三点,您能够总结出来,恭喜您,说明您已经掌握了裸机代码框架的精髓!

虽然单向链表使用起来很灵活,毕竟有用到了数据结构的链表技术点,对于链表,指针,我相信初学者看到这里,大部分都会懵逼了。。。

那再思考下,如果我们在基于链表的裸机代码框架上,用数组来实现,不用链表,并且也保留上述3个功能,能够实现吗?这种写法,我相信初学者也很喜欢,毕竟没有链表和指针嘛

答案是:可以的。我尝试了一下,修改代码如下:

【1】先定义宏定义,方便代码的理解

/*宏定义*/#define ON 1#define OFF 0#define TASK_COUNT 3#define LED1_Task taskArray[0]#define LED2_Task taskArray[1]#define LED3_Task taskArray[2]

【2】定义一个表示的任务的结构体类型

注意:和单链表的裸机代码相比,这里多加了一个enable变量,当为ON,表示执行,当为OFF,表示停止执行,链表是通过插入和删除来实现的,我们这里就用标志位判断就好。

/*定义一个表示的任务的结构体类型*/typedef struct Task_t{ unsigned char enable; // 超时时间(用来与定时器心跳比较), unsigned int timeout; //循环定时触发时间(周期定时设置), 为0时代表单次定时 unsigned int repeat; void (*pTask)(void); //任务的函数指针 }Task_t;

【3】定义心跳全局变量和任务数组,包含3个任务

/*定义变量*/unsigned int g_task_ticks = 0;//心跳计数器Task_t taskArray[TASK_COUNT];

【4】心跳函数将心跳全局变量自加

Task_t tasks[]={ {0,100,100,DoTask1;} {0,200,200,DoTask2;} {0,300,300,DoTask3;}}unsigned int taskCount=sizeof(tasks)/sizeof(Task_t);

【5】任务初始化

void Task_Init(Task_t* htask, void(*pTask)(), unsigned int timeout, unsigned int repeat, unsigned char enable){ htask->timeout = g_task_ticks + timeout;htask->repeat = repeat;htask->pTask = pTask;htask->enable = enable;}

【6】任务启动和停止函数

void Task_Start(Task_t* htask){htask->enable = ON;}void Task_Stop(Task_t* htask){htask->enable = OFF;}

【7】任务处理函数,判断时间是否到了,到了就执行

void Task_Process(){unsigned char i = 0;for (i = 0; i < TASK_COUNT; i++)//遍历任务数组 {if ((&taskArray[i])->enable == ON){if(g_task_ticks >= (&taskArray[i])->timeout){if((&taskArray[i])->repeat == 0){(&taskArray[i])->enable = OFF;}else{(&taskArray[i])->timeout = g_task_ticks + (&taskArray[i])->repeat;}(&taskArray[i])->pTask();}}}}

【8】定义task结构体中指针函数所指向的函数体,每个任务要执行的内容

void DoTask1() {LED1=~LED1;}void DoTask2() {LED2=~LED2;}void DoTask3() {LED3=~LED3;}

通过以上8步,就完成了此框架的所有代码,应用上需要注意的地方

(1)应用方法操作步骤如下,

①Task_Init函数初始化并启动各个任务

③心跳自加函数Task_Ticks()放到定时器中断中,每隔一段时间(本范例5ms)自加一次

④在while(1)死循环中执行Task_Process()

//系统初始化void System_Init(){Timer0_Init();Task_Init(&LED1_Task,DoTask1,100,100,ON);Task_Init(&LED2_Task,DoTask2,200,200,ON);Task_Init(&LED3_Task,DoTask3,300,300,ON);EA = 1;}// 主程序void main(){System_Init();while(1){Task_Process();}}//定时器0初始化void Timer0_Init(){TMOD &= 0xF0;TMOD |= 0x01;//T0工作于模式1,16位定时器TL0 = 0x00;//定时器赋初值TH0 = 0xEE;ET0 = 1;//允许T0中断TR0 = 1;}//定时器中断函数void Timer0_ISR() interrupt 1{TL0 = 0x00;//定时器赋初值TH0 = 0xEE;Task_Ticks();}

仿真结果如下,完全符合预期,并且我写试过,单次触发,停止或者启动,都是OK的,这里就不在演示了,您可以自行调试一下。

喜欢这篇文章,帮忙点个“关注 + 收藏”哦

附上源码:

taks.h

task.c

main.c

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
《我妻之死》作者回应质疑:婚姻中并非坐享其成,有11年承担家庭支出

《我妻之死》作者回应质疑:婚姻中并非坐享其成,有11年承担家庭支出

红星新闻
2024-05-01 14:59:34
这座高铁站或将成湖南最大站,总规模达16台30线,预计2025年竣工

这座高铁站或将成湖南最大站,总规模达16台30线,预计2025年竣工

音乐时光的娱乐
2024-05-01 09:58:48
再贵也要买,这5种蔬菜的农药残留为“0”,营养好吃,干净又卫生

再贵也要买,这5种蔬菜的农药残留为“0”,营养好吃,干净又卫生

华庭讲美食
2024-05-01 07:50:28
上身棉袄下穿短裙,搞不懂什么季节?

上身棉袄下穿短裙,搞不懂什么季节?

娱乐小可爱蛙
2024-05-01 09:42:04
FF汽车退市了,输家却不是贾跃亭,而是上海大佬朱骏

FF汽车退市了,输家却不是贾跃亭,而是上海大佬朱骏

担扑
2024-04-30 19:13:40
卖掉油车,换了电车,如今开了2年多,终于明白网上说的都是真的

卖掉油车,换了电车,如今开了2年多,终于明白网上说的都是真的

西山来客
2024-04-11 10:07:13
病毒学家张永振事件新进展,范小红书记回应:赖着不走,强买强卖

病毒学家张永振事件新进展,范小红书记回应:赖着不走,强买强卖

育学笔谈
2024-04-30 12:20:23
马斯克现身中国!穿大面积褶皱西服,对比旁人显差距,像搓衣板!

马斯克现身中国!穿大面积褶皱西服,对比旁人显差距,像搓衣板!

小咪侃娱圈
2024-05-01 14:42:26
奥尼尔谈MVP:投票人中应该有50个名人堂成员和50个前NBA球员

奥尼尔谈MVP:投票人中应该有50个名人堂成员和50个前NBA球员

直播吧
2024-05-01 13:31:13
“五一”热度最高的5大城市,假期还没到,就已经被挤爆了!

“五一”热度最高的5大城市,假期还没到,就已经被挤爆了!

毒舌混知所
2024-05-01 07:15:10
Woj:里奇-保罗透露父子同台不是詹姆斯目前最优先考虑的

Woj:里奇-保罗透露父子同台不是詹姆斯目前最优先考虑的

直播吧
2024-05-01 06:03:16
演员白敬亭在宁波北仑嫖娼被抓?多方辟谣

演员白敬亭在宁波北仑嫖娼被抓?多方辟谣

Super历史
2024-04-30 15:57:27
中国禁毒力度到底有多大?网友:外国人都傻了,中国没有毒品吗?

中国禁毒力度到底有多大?网友:外国人都傻了,中国没有毒品吗?

农人老寓
2024-05-01 11:32:56
弟弟夺得天下后让哥当皇帝,哥哥:果然是好弟弟,不久皇帝被毒死

弟弟夺得天下后让哥当皇帝,哥哥:果然是好弟弟,不久皇帝被毒死

否知的否
2024-04-29 17:37:11
太炸裂了!新iPad Pro居然首发M4,性能直接上天

太炸裂了!新iPad Pro居然首发M4,性能直接上天

雷科技
2024-04-30 21:40:42
货车“夫妻车”上真的都是真夫妻吗?我的经历说出实话

货车“夫妻车”上真的都是真夫妻吗?我的经历说出实话

杨木林
2024-03-13 12:01:00
他们凌晨抵京,带回31.5公斤“太空特产”!

他们凌晨抵京,带回31.5公斤“太空特产”!

新京报
2024-05-01 08:18:58
年薪1400万东京电力女高管,为何风俗街卖身赚钱,离奇被残害?

年薪1400万东京电力女高管,为何风俗街卖身赚钱,离奇被残害?

光头哥的头
2024-04-14 10:01:12
政治局会议提研究消化存量房产,住宅待售面积与多地二手房挂牌量大增,“以旧换新”成新动力源

政治局会议提研究消化存量房产,住宅待售面积与多地二手房挂牌量大增,“以旧换新”成新动力源

华夏时报
2024-04-30 17:51:33
2024年养老金调整,60、65、70岁,分别是哪些省市的高龄门槛?

2024年养老金调整,60、65、70岁,分别是哪些省市的高龄门槛?

小强财艺
2024-05-01 10:22:08
2024-05-01 17:54:44
黑科技数码
黑科技数码
网罗最新电子科技产品
416文章数 107249关注度
往期回顾 全部

科技要闻

余承东卸任华为终端CEO 新任命为董事长

头条要闻

59岁大龄司机"卷"进网约车:再干1年退休 退休金6千

头条要闻

59岁大龄司机"卷"进网约车:再干1年退休 退休金6千

体育要闻

"意甲最佳"金玟哉 踢回了中超水平...

娱乐要闻

黄子韬被曝求婚徐艺洋 大量亲密照曝光

财经要闻

俞敏洪,踏足A股!

汽车要闻

预售2.89-3.49万 奔腾小马正式开启预售

态度原创

家居
时尚
亲子
数码
公开课

家居要闻

心之所栖 黑白灰色系打造设计专属感

坚决不穿老年装,不强行装嫩,才是日本50岁男人“反油腻”的秘诀

亲子要闻

有的玩笑话,会给孩子留下不可磨灭的伤害

数码要闻

AMD对AI芯片业务的展望逊于预期 英伟达霸主地位仍不可撼动

公开课

父亲年龄越大孩子越不聪明?

无障碍浏览 进入关怀版