一种基于事件驱动的单片机操作系统实现方法与流程
未命名
09-29
阅读:99
评论:0

1.本发明涉及单片机操作系统的技术领域,特别涉及一种基于事件驱动的单片机操作系统实现方法。
背景技术:
2.单片机的嵌入式系统在各种智能化装备和设备中得到了广泛的应用,由于单片机性能和功能要求越来越高,因而需要一个相应的单片机操作系统来管理和控制单片机各个部件的协调工作。
3.单片机操作系统是指在单片机上运行的一种操作系统,主要作用是管理和控制单片机的各个软件和硬件模块,协调各个任务的调度与处理,提高单片机的运行效率和性能,并且能够方便地与外部设备进行数据交换和通信。随着计算机技术水平的提高,单片机系统可以精简、紧凑地设计;可以根据任务的优先级、时序关系等灵活地进行调度和控制;可以应用于不同类型的单片机上,满足各种应用场景的需求。现有技术公开了一种单片机操作系统实现方法,首先定义了消息结构类型和消息结构类型的数组作为消息队列;然后设计了消息存取函数实现消息队列的先进先出功能;最后主函数无限循环读取消息,并根据消息值调用相应的任务处理函数,待任务处理函数返回后进行下一次循环,但该方法是对消息队列的存入,再对存入的消息先入先出地进行处理,先存入的消息先被执行,后存入的消息则需等待先存入的消息执行后再进行处理,任务处理过程较为机械化,处理灵活性差,且难以实时对存入的消息进行立即处理,任务响应实时性差,导致系统处理效率低。
技术实现要素:
4.为解决在当前单片机操作系统实现方法中,任务处理过程机械化,响应实时性差,导致系统处理效率低的问题,本发明提出了一种基于事件驱动的单片机操作系统实现方法,提供了一种灵活统一的系统架构,有效防止任务处理过程机械化,保证了任务响应实时性,提高了系统处理效率,从而指导用户对单片机软件进行开发。
5.为了达到上述技术效果,本发明的技术方案如下:
6.一种基于事件驱动的单片机操作系统实现方法,包括以下步骤:
7.s1.在单片机的随机存取存储器上申请用于保存事件驱动表的动态内存;
8.s2.对动态内存中的事件驱动表进行注册,得到注册有事件编号和事件编号对应的事件回调函数信息的事件驱动表;
9.s3.利用主函数获取单片机操作系统中待处理事件的事件信息,所述事件信息包含事件编号和若干个事件参数;
10.s4.判断所述待处理事件是否为有效事件,若是,执行步骤s5;否则,返回步骤s3;
11.s5.基于事件编号,查找所述事件驱动表中事件编号对应的事件回调函数,并调用回调函数指针将所述事件参数传入所述事件回调函数;
12.s6.调用所述事件回调函数对待处理事件进行处理,判断待处理事件是否为异步
事件;若是,无需等待事件回调函数对待处理事件处理的结果反馈,直接进行下一个待处理事件的触发,返回步骤s3;否则,待事件回调函数处理事件结束,执行步骤s7;
13.s7.判断单片机操作系统是否接收到事件回调函数处理事件结束的信息,若是,直接进行下一个待处理事件的触发,返回步骤s3;否则,释放所述动态内存。
14.优选地,采用malloc函数在单片机的随机存取存储器上申请用于保存事件驱动表的动态内存。
15.优选地,定义所述事件驱动表的结构体带有两个元素,其中一个元素表示事件编号;另一个元素表示回调函数指针,所述回调函数指针指向事件对应的事件回调函数。
16.优选地,所述事件编号为一个字节的变量。
17.优选地,所述对动态内存中的事件驱动表进行注册,具体包括:
18.s21.将所述动态内存中的事件驱动表划分为两列;
19.s22.在事件驱动表的其中一列填入事件编号,在事件驱动表的另一列填入事件编号对应的事件回调函数。
20.优选地,所述待处理事件包括按下按钮、读取传感器和发送串口信息。
21.优选地,若待处理事件不需要事件参数,则传入所述事件回调函数的事件参数为0。
22.优选地,若待处理事件为按下按钮的事件,则定义按下按钮的事件编号为1,基于事件编号1,查找所述事件驱动表中事件编号1对应的事件回调函数keypressevent,并调用回调函数指针将按下按钮的两个事件参数传入事件编号1对应的事件回调函数keypressevent;若待处理事件为读取传感器的事件,则定义读取传感器的事件编号为2,基于事件编号2,查找所述事件驱动表中事件编号2对应的事件回调函数readtempevent,并调用回调函数指针将读取传感器的两个事件参数传入事件编号2对应的事件回调函数readtempevent;若待处理事件为发送串口信息的事件,则定义发送串口信息的事件编号为3,基于事件编号3,查找所述事件驱动表中事件编号3对应的事件回调函数senddataevent,并调用回调函数指针将发送串口信息的两个事件参数传入事件编号3对应的事件回调函数senddataevent。
23.优选地,若需要等待事件处理结束后才开始处理下一个事件,则待处理事件为非异步事件;否则,待处理事件为异步事件。
24.优选地,所述方法采用c语言编写程序代码,在vr studio的开发环境下进行编译生成hex二进制执行文件。
25.与现有技术相比,本发明技术方案的有益效果是:
26.本发明提出一种基于事件驱动的单片机操作系统实现方法,首先在单片机的随机存取存储器上申请动态内存,用于保存事件驱动表,对动态内存中的事件驱动表进行注册,然后获取单片机操作系统中待处理事件的事件信息,如果待处理事件为有效事件,则查找事件驱动表中事件编号对应的事件回调函数,并传入事件参数,调用对应的事件回调函数进行处理,并通过判断待处理事件是否为异步事件,来决定是否需要等待事件回调函数处理事件结束才进行下一个待处理事件的触发;本发明采用了内存换时间的方式,提高了单片机系统响应事件的速度,满足高实时性响应要求高的应用环境,并提供了灵活统一的系统架构,有效防止任务处理过程机械化,保证了任务响应实时性的同时提高了系统处理效
率,从而指导用户对单片机软件进行开发。
附图说明
27.图1表示本发明实施例中提出的一种基于事件驱动的单片机操作系统实现方法的流程示意图;
28.图2表示本发明实施例中提出的事件驱动表的注册流程图。
具体实施方式
29.附图仅用于示例性说明,不能理解为对本专利的限制;
30.为了更好地说明本实施例,附图某些部位会有省略、放大或缩小,并不代表实际尺寸,“上”“下”等部位方向的描述非对本专利的限制;
31.对于本领域技术人员来说,附图中某些公知内容说明可能省略是可以理解的;
32.附图中描述位置关系的用于仅用于示例性说明,不能理解为对本专利的限制;
33.下面结合附图和实施例对本发明的技术方案做进一步的说明。
34.实施例1
35.如图1所示,本发明提出了一种基于事件驱动的单片机操作系统实现方法,所述方法采用c语言编写程序代码,在vr studio的开发环境下进行编译生成hex二进制执行文件,包括以下步骤:
36.s1.在单片机的随机存取存储器上申请用于保存事件驱动表的动态内存;
37.众所周知,单片机的程序存储空间和数据存储空间虽然相对匮乏,但本实施例单片机系统处理的信息的复杂度较低,量不大,在步骤s1中,可以在单片机的随机存取存储器上动态申请一块内存用于事件驱动表,以实现快速响应用户操作或信号事件的触发;并采用malloc函数在单片机的随机存取存储器上申请用于保存事件驱动表的动态内存,其保存在随机存取存储器中能被更快速地访问;
38.malloc函数申请的动态内存保存在堆中,堆是一种动态分配内存的方式,它向内存地址高地址方向生长,能够为系统运行时需要动态分配的内存提供支持,malloc函数自动指定起始地址为全局变量及预赋值变量后面;当malloc函数不再需要在堆中分配的内存时,必须手动释放内存空间,否则就会出现内存泄漏,即该内存空间将一直保留在堆中占用内存,而且在malloc函数执行结束后仍然存在,因此,释放堆中的内存空间是十分重要和必要的,释放堆中的内存空间可以通过调用free函数来释放在堆中分配的内存空间。
39.s2.对动态内存中的事件驱动表进行注册,得到注册有事件编号和事件编号对应的事件回调函数信息的事件驱动表;
40.s3.利用主函数获取单片机操作系统中待处理事件的事件信息,所述事件信息包含事件编号和若干个事件参数;
41.s4.判断所述待处理事件是否为有效事件,若是,执行步骤s5;否则,返回步骤s3;
42.s5.基于事件编号,查找所述事件驱动表中事件编号对应的事件回调函数,并调用回调函数指针将所述事件参数传入所述事件回调函数;
43.s6.调用所述事件回调函数对待处理事件进行处理,判断待处理事件是否为异步事件;若是,无需等待事件回调函数对待处理事件处理的结果反馈,直接进行下一个待处理
事件的触发,返回步骤s3;否则,待事件回调函数处理事件结束,执行步骤s7;
44.在步骤s6中,若需要等待事件处理结束后才开始处理下一个事件,则待处理事件为非异步事件;否则,待处理事件为异步事件。
45.s7.判断单片机操作系统是否接收到事件回调函数处理事件结束的信息,若是,直接进行下一个待处理事件的触发,返回步骤s3;否则,释放所述动态内存。
46.在本实施例中,首先在单片机的随机存取存储器上申请动态内存,用于保存事件驱动表,对动态内存中的事件驱动表进行注册,然后获取单片机操作系统中待处理事件的事件信息,如果待处理事件为有效事件,则查找事件驱动表中事件编号对应的事件回调函数,并传入事件参数,调用对应的事件回调函数进行处理,并通过判断待处理事件是否为异步事件,来决定是否需要等待事件回调函数处理事件结束才进行下一个待处理事件的触发;本发明采用了内存换时间的方式,提高了单片机系统响应事件的速度,满足高实时性响应要求高的应用环境,并提供了灵活统一的系统架构,提高系统架构可维护性,规范系统架构编写风格,有效防止任务处理过程机械化,保证了任务响应实时性的同时提高了系统处理效率,从而指导用户对单片机软件进行开发,提高单片机软件开发效率。
47.实施例2
48.本实施例对事件驱动表的结构体做进一步的说明,事件驱动表是一个数据结构,存储单片机操作系统中各种待处理事件的相关信息,可以理解为单片机操作系统中的一个待处理事件与其对应事件回调函数的映射表,其作用是方便单片机操作系统管理各种待处理事件,快速定位待处理事件对应的事件回调函数。表1为未注册的事件驱动表,参见表1,定义所述事件驱动表的结构体带有两个元素,其中一个元素为一个字节的变量,表示事件编号,事件编号是一个标识一个特定事件的数值,不同的事件对应不同的编号,其作用是在系统中区分不同的待处理事件,方便单片机操作系统管理和定位对应的事件回调函数。另一个元素表示回调函数指针,所述回调函数指针指向事件对应的事件回调函数,该事件回调函数将在特定事件发生时被调用,回调函数指针作用是将事件处理的任务从主函数中分离出来,便于单片机操作系统管理和维护,同时提高了代码的可读性和可维护性,不同事件的事件参数个数不一样,如0个事件参数或1个事件参数或2个事件参数,本实施例选定的事件回调函数被定义为带两个事件参数。
49.表1未注册的事件驱动表
50.事件编号事件回调函数
ꢀꢀ
51.参见图2,所述对动态内存中的事件驱动表进行注册,具体包括:
52.s21.将所述动态内存中的事件驱动表划分为两列;
53.s22.在事件驱动表的其中一列填入事件编号,在事件驱动表的另一列填入事件编号对应的事件回调函数。
54.将动态内存中的事件驱动表的表模用代码的形式表达如下:
[0055][0056]
上述代码实现了定义了一个表,表由两列组成,一列名为“事件编号”,另一列名为“回调函数”,即事件的功能代码段的起始位置,且规定调用回调函数指针需要传入两个事件参数。
[0057]
实施例3
[0058]
本实施例对所述事件驱动表的作用进行进一步说明;事件回调函数理解为实现功能的代码段起始的地址(位置),调用回调函数指针是代码从当前地址(位置)跳转到实现功能的代码段起始的地址(位置)并执行代码段;事件驱动表划分为两列,一列填入事件编号,另一列填入事件编号对应的事件回调函数,单片机操作系统中待处理事件的事件信息包含事件编号和两个个事件参数,所述待处理事件包括按下按钮、读取传感器和发送串口信息,若待处理事件不需要事件参数,则传入所述事件回调函数的事件参数为0。
[0059]
参见表2,若待处理事件为按下按钮的事件,则定义按下按钮的事件编号为1,当单片机操作系统接收到事件编号1的按下按钮事件,且按钮序号为keyindex,基于事件编号1,单片机操作系统就会在事件驱动表中查找事件编号为1的名称为keypressevent的事件回调函数,并调用回调函数指针将按下按钮的两个事件参数传入事件编号1对应的事件回调函数keypressevent,一个事件参数表示被按下命名为keyindex按钮的序号,另一个事件参数表示0,代码表示为keypressevent(keyindex,0),说明按下按钮的事件只需要一个事件参数,不需要的另一个事件参数为0;
[0060]
若待处理事件为读取传感器的事件,则定义读取传感器的事件编号为2,当单片机操作系统接收到事件编号2的读取传感器事件,单片机操作系统就会在事件驱动表中查找事件编号为1的名称为keypressevent的事件回调函数,基于事件编号2,单片机操作系统就会在事件驱动表中查找事件编号为2的名称为readtempevent的事件回调函数,并调用回调函数指针将读取传感器的两个事件参数传入事件编号2对应的事件回调函数readtempevent;
[0061]
若待处理事件为发送串口信息的事件,则定义发送串口信息的事件编号为3,当单片机操作系统接收到事件编号3的发送串口信息事件,单片机操作系统就会在事件驱动表中查找事件编号为3的名称为senddataevent的事件回调函数,基于事件编号3,查找所述事件驱动表中事件编号3对应的事件回调函senddataevent,并调用回调函数指针将发送串口信息的两个事件参数传入事件编号3对应的事件回调函数senddataevent。
[0062]
表2注册的事件驱动表
[0063]
事件编号事件回调函数1(表示按下按钮事件)事件回调函数1(名称keypressevent)2(表示读取传感器事件)事件回调函数2(名称为readtempevent)
3(表示发送串口信息事件)事件回调函数3(名称为senddataevent)4...........
[0064]
需要特别说明的是,在实际处理过程中,单片机操作系统中待处理事件包括但并不局限于上述按下按钮、读取传感器和发送串口信息事件,即还包括了其他待处理事件,本实施例仅以一个优先的实施例进行举例说明,同时对待处理事件的事件编号包括但并不局限上述事件编号1的按下按钮事件、事件编号2的读取传感器事件、事件编号3的发送串口信息事件等,可以是事件编号1的读取传感器事件、事件编号2的按下按钮事件、事件编号3的发送串口信息事件等,可以是事件编号1的发送串口信息事件、事件编号2的按下按钮事件、事件编号3的读取传感器事件等。
[0065]
显然,本发明的上述实施例仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明权利要求的保护范围之内。
技术特征:
1.一种基于事件驱动的单片机操作系统实现方法,其特征在于,包括以下步骤:s1.在单片机的随机存取存储器上申请用于保存事件驱动表的动态内存;s2.对动态内存中的事件驱动表进行注册,得到注册有事件编号和事件编号对应的事件回调函数信息的事件驱动表;s3.利用主函数获取单片机操作系统中待处理事件的事件信息,所述事件信息包含事件编号和若干个事件参数;s4.判断所述待处理事件是否为有效事件,若是,执行步骤s5;否则,返回步骤s3;s5.基于事件编号,查找所述事件驱动表中事件编号对应的事件回调函数,并调用回调函数指针将所述事件参数传入所述事件回调函数;s6.调用所述事件回调函数对待处理事件进行处理,判断待处理事件是否为异步事件;若是,无需等待事件回调函数对待处理事件处理的结果反馈,直接进行下一个待处理事件的触发,返回步骤s3;否则,待事件回调函数处理事件结束,执行步骤s7;s7.判断单片机操作系统是否接收到事件回调函数处理事件结束的信息,若是,直接进行下一个待处理事件的触发,返回步骤s3;否则,释放所述动态内存。2.根据权利要求1所述的基于事件驱动的单片机操作系统实现方法,其特征在于,采用malloc函数在单片机的随机存取存储器上申请用于保存事件驱动表的动态内存。3.根据权利要求2所述的基于事件驱动的单片机操作系统实现方法,其特征在于,定义所述事件驱动表的结构体带有两个元素,其中一个元素表示事件编号;另一个元素表示回调函数指针,所述回调函数指针指向事件对应的事件回调函数。4.根据权利要求3所述的基于事件驱动的单片机操作系统实现方法,其特征在于,所述事件编号为一个字节的变量。5.根据权利要求4所述的基于事件驱动的单片机操作系统实现方法,其特征在于,所述对动态内存中的事件驱动表进行注册,具体包括:s21.将所述动态内存中的事件驱动表划分为两列;s22.在事件驱动表的其中一列填入事件编号,在事件驱动表的另一列填入事件编号对应的事件回调函数。6.根据权利要求1所述的基于事件驱动的单片机操作系统实现方法,其特征在于,所述待处理事件包括按下按钮、读取传感器和发送串口信息。7.根据权利要求6所述的基于事件驱动的单片机操作系统实现方法,其特征在于,若待处理事件不需要事件参数,则传入所述事件回调函数的事件参数为0。8.根据权利要求7所述的基于事件驱动的单片机操作系统实现方法,其特征在于,若待处理事件为按下按钮的事件,则定义按下按钮的事件编号为1,基于事件编号1,查找所述事件驱动表中事件编号1对应的事件回调函数keypressevent,并调用回调函数指针将按下按钮的两个事件参数传入事件编号1对应的事件回调函数keypressevent;若待处理事件为读取传感器的事件,则定义读取传感器的事件编号为2,基于事件编号2,查找所述事件驱动表中事件编号2对应的事件回调函数readtempevent,并调用回调函数指针将读取传感器的两个事件参数传入事件编号2对应的事件回调函数readtempevent;若待处理事件为发送串口信息的事件,则定义发送串口信息的事件编号为3,基于事件编号3,查找所述事件驱动表中事件编号3对应的事件回调函数senddataevent,并调用回调函数指针将发送串口信息的两
个事件参数传入事件编号3对应的事件回调函数senddataevent。9.根据权利要求1所述的基于事件驱动的单片机操作系统实现方法,其特征在于,若需要等待事件处理结束后才开始处理下一个事件,则待处理事件为非异步事件;否则,待处理事件为异步事件。10.根据权利要求1-9任一项所述的基于事件驱动的单片机操作系统实现方法,其特征在于,所述方法采用c语言编写程序代码,在vr studio的开发环境下进行编译生成hex二进制执行文件。
技术总结
本发明提出一种基于事件驱动的单片机操作系统实现方法,涉及单片机操作系统的技术领域,首先申请用于保存事件驱动表动态内存,并注册事件驱动表,然后获取单片机操作系统中待处理事件的事件信息,如果待处理事件为有效事件,则查找事件驱动表中事件编号对应的事件回调函数,调用对应的事件回调函数进行处理,再通过判断待处理事件是否为异步事件,来决定是否需要等待事件回调函数处理事件结束才进行下一个待处理事件的触发;本发明提供了一种灵活统一的系统架构,有效防止任务处理过程机械化,保证了任务响应实时性,提高了系统处理效率,从而指导用户对单片机软件进行开发。从而指导用户对单片机软件进行开发。从而指导用户对单片机软件进行开发。
技术研发人员:蔡树衡 郑镇钦 李泽鹏 杨伟浩 刘汉旭
受保护的技术使用者:广州凯普生物科技有限公司 广东凯普生物科技股份有限公司
技术研发日:2023.06.26
技术公布日:2023/9/25
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/