#创作者激励#【4.操作系统】多线程、定时器、中断开发例程 原创 精华
【文正在参加2023年第一期优质创作者激励计划】
OpenHarmony轻量和小型系统开发例程2023
【0.开发环境搭建】
【1.GPIO基本操作】
【2.硬件通信uart\i2c\spi\i2s】
【3.无线通信 wifi mqtt】
【4.操作系统 多线程、定时器、中断】
目录
4.操作系统
4.1 多线程
4.1.1 多线程相关函数GPI
OpenHarmony是一个可裁剪的操作系统,hi3861运行着裁剪后的轻量化系统,支持多线程。下面先看多线程相关的函数:
4.1.2 多线程点灯实例
下面编写一个多线程实例,一个线程检测按键,当按键按下时,另一个线程实现点亮LED。
- 第一步,在iothardware目录下,新建osthread_demo.c文件,首先定义线程相关的宏,引入头头文件,并定义一个全局变量value,用于指示按键状态,便于控制LED,在osthread_demo.c中添加如下代码:
- 第二步,编写按键检测的线程。流程和第一篇实验雷同,初始化GPIO,编写业务逻辑(检测按键)、注册线程。https://ost.51cto.com/posts/22450#_LED_19, 不详细赘述。下面给出代码,在osthread_demo.c中继续追加如下代码:
- 第三步,雷同第二步,编写LED任务线程,初始化LED的GPIO,编写逻辑,由value的值确定led亮灭,最后注册另一个线程。在osthread_demo.c中继续追加如下代码:
在osthread_demo.c中第二步代码基础上添加注册led线程任务,
- 第四步,编译运行,修改两处BUILD.gn。 修改src\applications\sample\wifi-iot\app\iothardware\BUILD.gn
修改src\applications\sample\wifi-iot\app\BUILD.gn
编译无误烧录运行后,可以看到和gpio_input_output实验一样的效果,按键按下,led亮。
可以注意到,有两个函数可以添加线程到活动任务中去:
4.2 定时器
4.2.1 定时器相关函数
定时器功能可以完成计数、定时任务等。轻量化系统也支持定时器,相关函数如下:
系统定时器原理(来自:物联网技术及应用实验指导手册):
- 软件定时器使用了系统的一个队列和一个任务资源,软件定时器的触发遵循队列规则,先进先出。定时时间短的定时器总是比定时时间长的靠近队列头,满足优先被触发的准则。软件定时器以Tick为基本计时单位,当用户创建并启动一个软件定时器时,LiteOS会根据当前系统Tick时间及用户设置的定时时间间隔确定该定时器的到期Tick时间,并将该定时器控制结构挂入计时全局链表。
- 当Tick中断到来时,在Tick中断处理函数中扫描软件定时器的计时全局链表,看是否有定时器超时,若有则将超过的定时器记录下来。
- Tick中断处理函数结束后,软件定时器任务(优先级为最高)被唤醒,在该任务中调用之前记录下
来的定时器的超时回调函数。
4.2.2 定时开关灯实例
本实验使用定时器功能,每1s切换一次LED状态。
- 第一步,在iohardware目录下新建timer_led.c文件,定义LED闪烁次数、线程等宏,编写切换LED状态的函数,用于软件定时器的回调。具体代码如下:
- 第二步,创建周期性的定时器,回调函数是上述BlinkLed函数;然后开启定时,每100个时钟周期执行依次回调函数(一个周期是10ms)。在文件中,追加如下代码:
- 第三步,当达到指定定时次数后,停止定时,删除定时器。在void TimerThread(const char *arg)函数中继续添加如下代码:
- 第四步,开启线程,运行任务。
- 第五步,编译烧录运行。修改iothardware下的BUILD文件,将timer_led.c添加入sources = [ ]字段中。运行后打开Monitor可以看到count从1-5变化,LED在闪烁,5s后停止闪烁。
4.3 中断
4.2.1 中断相关函数
中断原理(来自:物联网技术及应用实验指导手册):中断是指CPU暂停执行当前程序,转而执行新程序的过程。中断相关的硬件可以划
分为3类:
- 设备:发起中断的源,当设备需要请求CPU时,产生一个中断信号,该信号连接至中断控制器。
- 中断控制器:接收中断输入并上报给CPU。可以设置中断源的优先级、触发方式、打开和关闭等
操作。 - CPU软中断: 由CPU软件发起的中断,一般用于操作系统的模式和线程切换。
使用场景:
当有中断请求产生时,CPU暂停当前的任务,转而去响应外设请求。用户通过中断申请,注册中断
处理程序,可以指定CPU响应中断请求时所执行的具体操作。
4.2.2 中断实例
hi3861_hdu源码中有给定定时器实验案例。下面简要说明如何运行。
- 第一步 hi3861_hdu_iot_application/src/vendor/hisilicon/hispark_pegasus/demo/interrupt_demo文件夹复制到hi3861_hdu_iot_application/src/applications/sample/wifi-iot/app/目录下。
- 第二步:修改applications/sample/wifi-iot/app/目录下的BUILD.gn,在features字段中添加interrupt_demo:interrupt_demo。
打开文件可以看到,demo设定了定时器、获取时钟频率,开启了中断。实现了每一秒中断1次执行中断处理函数,输出一段into the func timer2_irq_handle,这个中断是在3s函数hi_sleep()执行时切入进去的。
第三步,编译运行。现象是在Monitor看到串口输出两行into the func timer2_irq_handle。
近期大佬是真的高产
实操的讲解很详细
学物联网的看这些名词很亲切
正在学习参考一下