版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实时操作系统应用开发技术第六章
RTOS下程序设计方法主讲人:王宜怀时间:2025.61/24CONTENT01020304目录程序稳定性问题ISR设计、线程划分及优先级安排问题利用信号量解决并发与资源共享的问题优先级反转问题2/24程序稳定性问题实时操作系统应用开发技术6.1PART-3/24程序稳定性问题是程序设计的核心问题,也是复杂问题,本节给出程序稳定性问题最基础性论述。这个论述不局限于RTOS下程序设计,也适用于OS下程序设计。6.1
程序稳定性问题4/24保证通信稳定是嵌入式系统的关键。可通过选用低速波特率、增加校验等方式增强通信稳定性。例如,串行接口选用9600波特率,增加循环冗余校验。保证通信的稳定物理信号输入稳定对系统至关重要。可通过软件滤波等方法增强信号稳定性。例如,对模拟量采用中位值滤波法,对开关量采用基于统计计数的判定方法。保证物理信号输入的稳定嵌入式系统稳定性要求保证CPU运行稳定。可通过指令冗余、软件拦截技术、数据保护等方法增强CPU运行稳定性。例如,在双字节指令后插入NOP指令,避免程序跑飞。保证CPU运行的稳定物理信号输出稳定是系统可靠运行的保障。可通过输出重置、滤波等方法保证输出稳定。例如,定期向输出系统重置参数,对输出进行柔和控制。保证物理信号输出的稳定020104036.1.1
稳定性的基本要求5/24看门狗定时器是解决计算机运行“跑飞”问题的重要手段。通过设定初值并定期清零,防止程序出错。例如,设置看门狗复位时间为2秒,定期喂狗。定期复位是主动进行系统复位重启的操作。适用于主程序正常但部分功能异常的情况。例如,在RISC-V内核芯片中,使用NVIC_SystemReset()函数进行软件强制复位。看门狗复位的应用定期复位的应用01026.1.2
看门狗与定期复位的应用6/24样例程序【03-Software\CH06\Wdog】给出了看门狗的测试方法。例中使用wdog_start()、wdog_feed()两个函数对看门狗进行开启和喂狗操作。看门狗复位的应用016.1.2
看门狗与定期复位的应用7/24临界区是处理时不可分割的代码段。在RTOS下,可通过信号量或互斥量保证进程对临界资源的互斥访问。例如,在LiteOS中,对系统临界代码段的保护采用关闭中断方式。临界区的定义与保护6.1.3
临界区的处理8/24ISR设计、线程划分及优先级安排问题实时操作系统应用开发技术6.2PART-9/24ISR与线程优先级关系不同操作系统对ISR与线程优先级的处理不同。例如,在LiteOS中,线程优先级与中断优先级不关联,不会屏蔽任何中断。ISR的基本要求ISR的基本要求是短、小、精、悍。用于快速响应硬件中断和异常,通常用C语言编写。例如,ISR用于告知线程已经就绪,通过设置事件位或发送消息等方式。6.2.1ISR设计的基本问题10/24功能联系紧密的工作可作为一个线程实现。例如,将多个独立模块安排在线程中完成,提高系统效率。1.功能集中原则实时性要求高的线程应分配较高优先级。例如,解帧线程优先级应高于其他线程,确保数据及时解帧。2.时间紧迫原则周期性执行的线程可将等待信号量置于循环体之前。例如,周期性任务在等待信号量后进入循环体。3.周期执行原则6.2.2
线程划分的基本原则11/24自启动线程是RTOS启动时运行的第一个线程,用于创建其他线程。其优先级应设置为最高,避免被抢占。1.自启动线程优先级最高紧迫性、关键性线程优先级要高。例如,与ISR关联的线程优先级应尽可能高,确保系统实时性和数据完整性。2.紧迫性线程优先级安排没有特殊优先执行的线程可设置为同一优先级,降低内存开销,提高调度速度。例如,多个线程可设置为同一优先级,减少就绪列表个数。3.同优先级线程的安排有执行顺序的线程,上游线程优先级高,下游线程优先级低。例如,根据信息传递顺序安排线程优先级。4.有执行顺序要求的安排运行时间长的线程优先级低。例如,数据处理线程优先级低,可一直处于就绪状态的线程优先级最低。5.低优先级的安排6.2.3线程优先级安排问题12/24利用信号量解决并发与资源共享的问题实时操作系统应用开发技术6.3PART-13/2403.01.02.银行取钱问题银行取钱问题是一个典型的并发与资源共享问题。两个线程同时对账户取钱,可能导致余额错误。例如,账户余额1000元,两个线程同时取800元,可能出现余额为-600元的情况。并发的问题并发性是操作系统的重要特征,但也会引发问题。例如,多个线程并发执行,若不加约束,会导致结果错误。共享缓冲区的问题共享缓冲区解决了高速与低速设备之间速度不匹配的问题,但也带来了数据安全性问题。例如,同时读写文件可能导致数据读写不全或缺失。6.3.1并发与资源共享的问题14/24生产者-消费者模型是信号量的经典用法之一。生产者线程向缓冲区写入资源,消费者线程从缓冲区获取资源。例如,生产者线程等待空闲空间信号量,消费者线程等待资源数信号量。1.模型的描述样例程序通过串口输出生产者-消费者模型的运行情况。例如,生产者线程将数据放入队列,消费者线程从队列中取出数据。2.样例程序生产者线程和消费者线程的执行流程分别为:申请信号量、进入缓冲区、操作资源、释放信号量。例如,生产者线程申请空闲空间信号量,进入缓冲区生产资源,释放资源数信号量。3.程序执行流程分析与运行结果6.3.2应用实例15/24G_VAR_PREFIXmutex_t
g_Mutex;//定义进入缓冲区的互斥G_VAR_PREFIXsem_t
g_SPSource;//定义缓冲区中资源数的信号量G_VAR_PREFIXsem_t
g_SPFree;//定义缓冲区中空闲空间的信号量G_VAR_PREFIXQueue_t*g_Queue;//声明队列2.样例程序6.3.2应用实例16/24定义信号量以及全局变量。在includes.h
文件中定义一个记录缓冲区中资源数的信号量(g_SPSource),一个记录缓冲区中空闲内存数的信号量(g_SPFree),一个记录缓冲区互斥量(g_Mutex),以及一个队列(g_Queue)代码如下:typedefstructBufferDate{uint32_tdata;//数据}BufferDate_t;//声明缓冲区结构体2.样例程序6.3.2应用实例17/24定义结构体变量。定义一个结构体类型数据,用于存放数据,并将此结构体类型放入队列中,其具体声明如下:g_Mutex=mutex_create("g_Mutex",IPC_FLAG_PRIO);//创建互斥量g_SPFree=sem_create("g_SPFree",10,IPC_FLAG_FIFO);//创建空闲空间的信号量g_SPSource=sem_create("g_SPSource",0,IPC_FLAG_FIFO);//创建资源数的信号量g_Queue=queue_init(sizeof(BufferDate_t),QUE_MAXSIZE);//初始化队列2.样例程序6.3.2应用实例18/24创建信号量。在本节样例程序中,在07_AppPrg/threadauto_appinit.c
中给信号量以及队列赋初值,代码如下:优先级反转问题实时操作系统应用开发技术6.4PART-19/240203011.火星探路者问题火星探路者出现系统复位、数据丢失现象,原因是优先级反转问题。例如,高优先级线程等待低优先级线程释放信号量时,被中优先级线程抢占。2.优先级反转问题的一般性描述优先级反转问题是低优先级线程先于高优先级线程运行的现象。例如,线程Ta、Tb、Tc,优先级分别为Pa、Pb、Pc,Ta和Tc需要共享资源S,Tb不使用S,可能出现Tb先于Ta运行的情况。3.解决优先级反转的基本思路解决优先级反转问题的方法是优先级继承。例如,当Tc获取共享资源S期间,将Pc临时提高到Pa,使Tb不能抢占Tc。6.4.1优先级反转问题的出现20/2402032.优先级反转问题的一般性描述可从一般意义上描述优先级反转问题。当线程以独占方式使用共享资源时,可能出现低优先级线程先于高优先级线程被运行的现象,这就是线程优先级反转问题,可进行如下一般性描述。6.4.1优先级反转问题的出现21/24此处给出使用互斥量的优先级继承方法解决优先级反转问题的例程,具体程序可参见【03-Software\CH06\PrioReverseSolve】。设置三个线程taskA、taskB、taskC,优先级分别为Pa、Pb、Pc,且Pa>Pb>Pc。程序具体的一次运行过程如表6-2所示。6.4.2
LiteOS中避免优先级反转问题的方法22/24STEP.01STEP.02STEP.03互斥量的优先级继承LiteOS中的互斥量具有避免优先级反转的功能。例如,使用互斥量作为同步量,当低优先级线程获取互斥量时,高优先级线程申请访问资源,将低优先级线程的优先级临时提高。样例程序样例程序通过创建三个线程taskA、taskB、taskC,演示了互斥量解决优先级反转问题的过程。例如,taskC获得互斥量,taskA申请互斥量失败,临时提升taskC的优先级,等待taskC释放互斥量。运行流程分析taskC获得互斥量并运行,taskA抢占taskC但申请互斥量失败,临时提升taskC的优先级,taskB等待。taskC释放互斥量后,taskA获得互斥量并运行,taskB获得CPU使用权。6.4.2
LiteOS中避免优先级反转问题的方法23/24实时操作系统应用开发技术谢谢大家主讲人:王宜怀时间:2025.624/24实时操作系统应用开发技术第七章初步理解轻量级鸿蒙LiteOS的调度原理主讲人:王宜怀时间:2025.61/4801理解RTOS所需要的相关基础知识LiteOS中的时钟嘀嗒剖析LiteOS中的信号量与互斥量的触发过程分析030502LiteOS的启动流程分析LiteOS中的事件与消息队列的触发过程分析本章小结0406目录CONTENTS2/48理解RTOS所需要的相关基础知识实时操作系统应用开发技术7.1PART-3/48CPU内部寄存器至少包括数据缓冲类、栈指针类、程序指针类、程序运行状态类及其他功能寄存器。通用寄存器数量最多,用于数据缓冲;栈指针寄存器用于管理局部变量存储区域;程序指针类寄存器指示将要执行的指令位置;程序运行状态类寄存器保存计算过程中的状态信息。1.CPU内部寄存器的基本分类RISC-V处理器有32个通用寄存器x0~x31,控制与状态寄存器(CSR)以及程序计数器(PC)。通用寄存器用于数据操作,x0为零值寄存器,x1为返回地址寄存器,x2为栈顶指针寄存器等;程序计数器指示当前执行指令地址;控制与状态寄存器用于保存处理器状态等信息。2.RISC-V中主要寄存器7.1.1CPU内部寄存器及RISC-V中主要寄存器4/48RISC-V处理器有32个通用寄存器x0~x31,控制与状态寄存器(CSR)以及程序计数器(PC)。如下图所示2.RISC-V中主要寄存器7.1.1CPU内部寄存器及RISC-V中主要寄存器5/48CH32V303所使用的青稞V4芯片处理器状态寄存器具体的位字段定义见表7-1。2.RISC-V中主要寄存器7.1.1CPU内部寄存器及RISC-V中主要寄存器6/4801C语言的基本数据类型C语言基本数据类型包括字节型、整型、实型等。字节型有有符号字节型和无符号字节型;整型有有符号短整型、无符号短整型、有符号长整型、无符号长整型;实型有浮点型和双精度型。构造类型有数组、结构、联合、枚举、指针和空类型。05C语言的数组数组是构造类型数据,由基本类型数据组成。一维数组定义需指定数组名和元素个数,通过下标访问元素;二维数组定义需指定行数和列数,可看作两个一维数组;字符数组用于存放字符数据,字符串以字符’\0’作为结束标志;动态数组可随程序需要重新指定大小,内存空间从堆上分配。02C语言的运算符C语言运算符分为算术、逻辑、关系和位运算等。算术运算符包括加、减、乘、除、取模等;逻辑运算符包括逻辑或、逻辑与、逻辑非;关系运算符包括大于、小于、大于等于、小于等于、等于、不等于;位运算符包括按位取反、左移、右移、按位与、按位异或、按位或。06C语言的指针指针是特殊数据类型,表示变量地址。指针变量定义需指定类型,赋值只能赋予地址;指针运算包括取地址运算符&、取内容运算符*、指针加减算术运算;void指针是无类型指针,可赋值给任何类型指针,但需强制类型转换。03C语言的流程控制C语言流程控制包括顺序结构、选择结构和循环结构。顺序结构按顺序执行语句;选择结构根据条件决定执行哪些语句,包括if结构和switch结构;循环结构包括for循环、while循环和do...while循环,用于重复执行某段代码。07C语言的构造类型构造类型包括结构体类型和枚举类型。结构体是用户定义的新类型,由不同类型的成员组成,成员通过名字访问;枚举类型用于声明一组命名的常数,变量值限于列举值范围内,可使代码更清晰。04C语言的函数函数是子程序,是语句的集合。使用函数时,需注意函数定义时声明类型、调用前声明、传参类型一致、返回值类型一致等。函数返回值由return语句决定,其类型与函数类型一致。08C语言的编译预处理C语言编译预处理包括宏定义、条件编译和文件包含。宏定义用#define定义宏名和表达式,预编译时替换;条件编译用#if、#else、#endif等判断是否编译某部分代码;文件包含用#include将一个文件内容包含到另一个文件中。7.1.2C语言概述7/48栈是操作受限的线性表,只允许在表的一端进行插入和删除操作,按后进先出原则进行,常用于保存和恢复中断现场、保存函数调用信息等;堆是内存中的存储单元,空间分配方式类似于链表,地址向上扩展,是不连续的内存区域,由用户分配释放。栈与堆队列是先进先出的线性表,只允许在表的一端插入,在另一端删除。队列按存储空间分配分为顺序队列与链队列,常用于对象的管理和调度。
队列链表是物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序通过指针链接次序实现。链表分为单向链表和双向链表,具有动态生成结点、操作灵活等优点,在RTOS中常用于管理媒介。链表0302017.1.3RTOS内核的常用数据结构8/48汇编语言源程序以行为单位设计,每一行最多包含标号、操作码、操作数、注释四个部分。标号必须在行首,由字母、数字、下划线、美元符号组成,不能以数字开头;操作码包括指令码和伪指令;操作数可以是地址、标号、常数等;注释以“#”引导。汇编语言格式01系统预定义的段包括.text、.data和.bss段,分别表示只读代码区、可读可写数据区和未初始化数据区。常量定义可使用.equ或.define指令。程序中插入常量可使用.word、.byte、.ascii/.asciz等伪指令。条件伪指令.if、.ifdef等用于条件编译。文件包含伪指令.include用于将另一个源文件插入当前源文件。其他常用伪指令包括.section、.global、.extern、.align、.end等。常用伪指令简介027.1.4汇编语言概述9/48LiteOS的启动流程分析实时操作系统应用开发技术7.2PART-10/48以LiteOS-Frame工程为基础,进行操作将其改为LiteOS源码用户可见的工程,包括复制工程、更改工程名、放置LiteOS源码文件、删除和更改相关文件等操作。1.构建LiteOS源码样例工程LiteOS-Analysis-A从链接文件中可得到中断向量表存放在Flash中的起始地址为0x0801C400,长度为1024字节;确定“.init”段处于FLASH中,表示中断向量表的偏移,偏移量为0x38;确定“.vector”段处于FLASH段中,表示中断向量表放在.vector段中,地址为0x0801C438。2.从链接文件CH32V307.ld中得到的信息在芯片启动文件中,使用链接文件确定的中断向量表首地址,将复位函数“handle_reset”的地址载入PC寄存器,从而跳转到复位处理函数,对堆栈指针SP、RAM初值、bss
段等一系列初始化工作进行设置,随后调用main函数。3.从芯片启动文件startup_ch32v30x.S得到的信息7.2.1芯片启动到main函数之前的运行过程11/48表7-5为对startup_ch32v30x.S文件部分内容进行剖析。7.2.1芯片启动到main函数之前的运行过程12/487.2.1芯片启动到main函数之前的运行过程13/48表7-5(续)芯片上电后执行到main函数,从main函数调用
OS_start
函数开始LiteOS的启动。OS_start
函数以实参
thread_auto
执行,完成系统的启动,包括初始化相关资源、创建自启动线程及空闲线程、启动调度器等。LiteOS启动的总体流程相关资源初始化包括板级硬件初始化、相关列表初始化和软件资源初始化。板级硬件初始化包括
Systick初始化、堆空间初始化和中断向量表初始化;相关列表初始化包括空闲列表与待删除列表初始化、任务排序列表与优先级队列初始化;软件资源初始化包括互斥量、信号量、消息队列初始化和软件定时器初始化。相关资源初始化工作创建自启动线程是通过在OS_start函数中初始化线程描述符相关信息,然后调用osThreadNew函数创建自启动线程。创建空闲线程是通过调用OsIdleTaskCreate函数创建空闲线程,其优先级默认为最低。创建自启动线程与空闲线程启动调度器是由调度器启动函数HalStartSchedule实现的,该函数初始化Systick,启动调度器,并进行第一次线程切换,切换到自启动线程运行。启动调度器040302017.2.2LiteOS启动流程解析14/48芯片上电后开始启动,执行到“07_AppPrg\main.c”的main函数后,接着从main函数调用OS_start
函数开始LiteOS的启动。1.LiteOS启动的总体流程7.2.2LiteOS启动流程解析15/48OS_start
函数位于05_UserBoard\LiteOS_Src\OsFunc.c
文件中,OsFunc.c
是为了收拢启动相关函数而由自定义的一个文件。为了方便用户自主决定自启动线程函数的名称,在该文件中定义了OS_start
函数。自启动线程thread_auto
为创建其他线程而准备的,是用户要完成的第一个线程,也称为自启动线程,首先设法使之被调度运行。1.LiteOS启动的总体流程7.2.2LiteOS启动流程解析16/48LiteOS启动过程总流程框图,如图7-6所示。1.LiteOS启动的总体流程7.2.2LiteOS启动流程解析17/48堆空间初始化函数OsMemSystemInit如下2.相关资源初始化工作7.2.2LiteOS启动流程解析18/48空闲列表与待删除列表初始化(OsTaskInit())函数代码如下2.相关资源初始化工作7.2.2LiteOS启动流程解析19/48OS_start
函数在OsFunc.c
文件中,代码如下3.创建自启动线程与空闲线程7.2.2LiteOS启动流程解析20/48启动调度器是由调度器启动函数HalStartSchedule()来实现的,该函数在LiteOS\kernel\arch\risc-v\V4A\gcc\los_context.c
文件中。4.启动调度器7.2.2LiteOS启动流程解析21/48线程切换准备函数HalTaskSwitch(),位于los_context.c
文件中。其主要功能是:通过OsSchedTaskSwitch()函数将当前线程挂起,新进程设置为运行状态。4.启动调度器7.2.2LiteOS启动流程解析22/48SW_Handler
函数执行流程包括保存上文环境、获取新线程的TCB控制块、切换到下文环境、退出中断等步骤。在保存上文环境时,会将通用寄存器、MSTATUS、MEPC
等寄存器值存入栈空间;在切换到下文环境时,会更新MSTATUS、MEPC、SP等寄存器值,并将新线程的上下文加载到CPU寄存器中。3.SW_Handler
源码剖析在进入中断程序时,MEPC
会保存异常或中断发生前
PC,mret
指令用于从异常或中断处理程序返回原来的执行地址。在
SW_Handler
中,通过读取新线程保存在栈空间的MEPC值更新当前的MEPC寄存器,所以在执行完
mret
指令之后能进入新线程执行。4.SW_Handler
结束后切换线程运行的缘由SW中断由软件直接触发,在LiteOS中,SW
中断服务例程
SW_Handler
的主要功能是保存上一个线程的上下文,查询下一个就绪线程,将下一个将要运行的线程的上下文加载到CPU寄存器中。1.SW中断概述SW_Handler
函数执行流程包括保存上文环境、获取新线程的TCB控制块、切换到下文环境、退出中断等步骤。在保存上文环境时,会将通用寄存器、MSTATUS、MEPC
等寄存器值存入栈空间;在切换到下文环境时,会更新MSTATUS、MEPC、SP等寄存器值,并将新线程的上下文加载到CPU寄存器中。2.自启动线程创建后的线程栈帧空间内容7.2.3SW中断服务例程23/48运行工程【03-Software\CH07\LiteOS-Analysis-B】可显示出自启动线程的线程控制块TCB所在RAM中的地点、内容,见图7-8。7.2.4LiteOS启动过程小结24/482.自启动线程创建后的线程栈帧空间容2.自启动线程创建后的线程栈帧空间容有关线程的具体信息,包括:线程栈空间地址、运行状态、栈空间大小、函数入口地址等存放在红灯线程的线程控制块TCB中。其内容梳理在图7-9中,图中每个格子代表一个字,即4个字节。7.2.4LiteOS启动过程小结25/482.自启动线程创建后的线程栈帧空间容LiteOS启动后,空闲线程、红灯线程、蓝灯线程和绿灯线程这四个线程之间的指向关系如图7-10所示。7.2.4LiteOS启动过程小结26/483.SW_Handler
源码剖析SW_Handler
执行流程如图7-11所示7.2.4LiteOS启动过程小结27/48LiteOS的启动过程分为两个阶段。第一阶段是芯片启动到main函数之前,完成堆栈指针初始化、系统时钟初始化等工作。第二阶段是在main函数中,LiteOS
开始启动,完成时间嘀嗒、堆空间、延时阻塞列表等初始化工作,创建自启动线程与空闲线程,启动调度器,最终实现线程切换和调度。”017.2.4LiteOS启动过程小结28/48LiteOS中的时钟嘀嗒剖析实时操作系统应用开发技术7.3PART-29/48SysTick定时器有6个32位寄存器,基地址为0xE000_F000。控制寄存器用于配置系统技术功能及状态标志;状态寄存器的第0位为计数值比较标志;计数器寄存器为当前计数的值,可编程设置初始计数值;比较寄存器用于和计数器进行比较;内核优先级设置寄存器用于设定Systick定时器中断的优先级。1.SysTick
定时器的寄存器LiteOS在硬件初始化函数
HalTickStart
中完成
SysTick
初始化。初始化步骤包括获取系统硬件级时钟频率、计算重载寄存器的值、设置
SysTick
中断优先级、使能
SysTick
中断、设置寄存器的值等。2.SysTick
定时器的初始化每一个嘀嗒中断,执行一次中断服务例程OsTickHandler,主要功能是更新时钟基准、调度时钟中断处理。若不需要切换任务,扫描定时器列表;若需要调度任务,执行任务调度函数;若不需要调度任务,更新当前任务时间片和下一个任务的到期时间。3.SysTick
中断服务例程剖析7.3.1时钟嘀嗒的建立与使用30/48。SysTick
定时器中有6个32位寄存器,基地址为:0xE000_F000,其偏移地址及简明功能如表7-6所示。1.SysTick
定时器的寄存器7.3.1时钟嘀嗒的建立与使用31/48制寄存器的30~6位为保留位,7个位有实际含义,如表7-7所示,这7位分别是软件中断触发使能位、计数器初始值更新选择位、计数模式控制位、自动重装载计数使能位、计数器时钟源选择位、计数器中断使能控制位和系统计数器使能控制位。1.SysTick
定时器的寄存器7.3.1时钟嘀嗒的建立与使用32/48HalTickStart
函数主要功能:初始化定时器功能相关配置。该函数主要功能主要为:计算一个周期的时钟数;使能SysTick
中断;设置SysTick
中断处理函数;使能重载寄存器;根据计算周期时钟数设置重载值;清零系统计数寄存器;设置计数模式为向上计数。SysTick
配置函数HalTickStart(handler)可在los_timer.c
文件中查看。2.SysTick
定时器的初始化7.3.1时钟嘀嗒的建立与使用33/48每一个嘀嗒中断,执行一次中断服务例程OsTickHandler,OsTickHandler
源码在los_tick.c
文件中,它通过调用LiteOS_SchedTickHandler()函数完成对线程调度的处理。3.SysTick
中断服务例程剖析7.3.1时钟嘀嗒的建立与使用34/48与调度相关的函数LOS_SchedTickHandler(),其程序执行流程如图7-12所示。3.SysTick
中断服务例程剖析7.3.1时钟嘀嗒的建立与使用35/48osTaskDelay函数的执行流程为:关中断、将当前任务状态设置为延时状态、设置当前任务延时时间、开中断、触发软件中断、进入软件中断处理函数、执行任务切换函数、将为延时状态的当前任务加入到阻塞队列、获取就绪队列中优先级最高的任务、将获取到的任务设置为正在运行。延时函数执行流程01在LiteOS中,定义了一个全局的延时阻塞列表,当线程需要延时的时候,就先把线程阻塞,然后将线程插入到这个延时阻塞列表中。任务切换函数内调用的OsAdd2SortLink函数就是将当前线程加入线程延时阻塞列表,而与之功能相反的是
LOS_ListDelete,它是从延时阻塞列表移除线程,这个函数由
OsSchedWakePendTimeTask
调用。延时函数内调用的主要函数分析027.3.2延时函数的调度机制分析36/48LiteOS中的事件与消息队列的触发过程分析实时操作系统应用开发技术7.4PART-37/48使用LiteOS-Event工程进行线程间事件调度机制实例分析,通过串口打印运行结果。线程启动后,绿灯线程等待事件字第2位,蓝灯线程设置事件字第2位,绿灯线程从阻塞列表中取出并放入就绪列表,等待事件字的第3位,红灯线程等待事件字的第3位,蓝灯线程设置事件字第3位,红灯线程从阻塞列表中取出并放入就绪列表,如此循环实现线程间的同步。2.线程之间的事件调度机制实例分析事件发送函数
LiteOS_EventWrite的主要功能是判断事件状态及参数是否正确、设置事件字的对应事件位、在事件阻塞列表中查找线程等待事件位与设置的事件位相同的线程并将其加入就绪列表、取就绪列表中最高优先级任务进行调度。事件接收函数LOS_EventRead的主要功能是判断线程和事件状态及参数是否正确、检查线程所等待的事件位是否发生、当线程所等待的事件位未发生时将线程放入阻塞列表、进入任务调度函数将当前任务阻塞并从就绪列表中取优先级最高任务运行、返回当前线程的状态。1.事件相关函数功能及执行流程7.4.1事件的触发过程38/487.4.1事件的触发过程39/487.4.1事件的触发过程40/48图中,纵向线表示线程、中断或列表的有效运行时间;横向线表示基本过程。消息队列发送消息函数osMessageQueuePut的主要功能是判断消息队列的状态和参数的合法性、检查消息队列的大小是否足够存放消息的数据部分、在消息队列中有写入空间时执行写入操作、如果有任务在等待写入消息操作的完成则唤醒等待的任务。消息队列接收消息函数osMessageQueueGet的主要功能是检查消息队列状态和参数的合法性、检查消息队列中是否有可取的消息、在消息队列中有可读取的消息时执行读取操作、如果有任务在等待读取消息操作的完成则唤醒等待的任务。消息队列主要函数剖析使用LiteOS-MessageQueue工程进行消息队列调度机制实例分析,通过串口打印运行结果。消息发送线程存放消息到消息队列,消息接收线程从消息队列获取消息,当消息队列满时,存放消息失败,产生消息溢出现象。通过消息的存放和获取过程,实现线程间的通信。消息队列调度机制实例分析01027.4.2消息队列的触发过程41/48线程间通过消息队列进行通信的演示程序,并通过串口(波特率设置为115200)打印出运行消息存放和获取的流程,消息队列使用方法时序如图7-19所示,程序工程见【03-Software\CH07\LiteOS-MessageQueue】。01027.4.2消息队列的触发过程42/48LiteOS中的信号量与互斥量的触发过程分析实时操作系统应用开发技术7.5PART-43/48等待获取信号量函数sem_take的主要功能是判断是否有可用信号量,若有则信号量值减一并返回获取成功,否则根据等待时间决定是否阻塞当前线程并插入到信号量阻塞列表中,若等待时间大于0则设置线程等待时间并启动定时器将当前线程放入延时列表。释放信号量函数sem_release的主要功能是检查信号量阻塞列表中是否有等待信号量的线程,若有则唤醒第一个线程并将其从延时列表中取出,若无则释放信号量,最后检查是否需要线程调度。使用LiteOS-Semaphore工程进行信号量调度实例分析,通过串口打印运行结果。线程通过sem_take函数获取信号量,若信号量可用则获取成功,否则线程阻塞等待;线程通过sem_release函数释放信号量,唤醒等待信号量的线程,实现线程间的同步。2.信号量调度实例分析1.信号量主要函数剖析7.5.1信号量44/48获取互斥量函数
mutex_take
的主要功能是判断当前获取互斥量的线程与持有互斥量的线程是否是同一线程,若是则持有值加1,若不是则检查互斥量是否上锁,未上锁时当前线程成功获取互斥量并设置持有信息,已上锁时根据等待时间决定是否阻塞当前线程并插入到互斥量阻塞列表中,若当前获取互斥量线程的优先级大于持有互斥量线程的优先级则提升持有线程的优先级。互斥量释放函数mutex_release的主要功能是检查当前线程与互斥量持有线程是否是同一线程,只有持有线程才能释放互斥量,释放后检查是否需要恢复线程的初始优先级,并检查互斥量阻塞列表中是否有等待当前互斥量的线程,若有则唤醒第一个线程并设置新的持有者信息,最后检查是否需要线程调度。1.互斥量主要函数剖析使用LiteOS-Mutex工程进行基于互斥量的优先级相同线程程序执行流程分析,通过串口打印运行结果。线程启动后,红灯线程申请锁定互斥量成功并切换红灯亮暗,蓝灯线程和绿灯线程申请锁定互斥量失败被放入互斥量阻塞列表,红灯线程解锁互斥量后,蓝灯线程和绿灯线程依次申请锁定互斥量并切换蓝灯和绿灯亮暗,如此循环实现线程对互斥量的独占访问。2.基于互斥量的优先级相同线程程序执行流程分析7.5.2互斥量45/48本章小结实时操作系统应用开发技术7.6PART-46/4847/48本章快速概要了理解LiteOS内部运行机制所需的基础知识,详细分析了LiteOS的启动过程,包括芯片复位开始执行的第一个指令到操作系统启动并执行自启动线程的流程,以及延时函数、事件、消息队列、信号量、互斥量等具有调度触发机制的部件的工作原理,使读者基本了解LiteOS的运行机制及为应用编程提供的服务。总结实时操作系统应用开发技术谢谢大家主讲人:王宜怀时间:2025.648/48实时操作系统应用开发技术第8章基于WiFi通信的物联网应用开发主讲人:王宜怀时间:2025.61/50目录contentsWiFi应用开发概述01WiFi应用架构及通信基本过程02终端及云侦听模板的适应性修改03运行Web网页04运行微信小程序05远程更新终端UE程序062/50WiFi应用开发概述实时操作系统应用开发技术PART-3/508.1WiFi主要用于无线上网,几乎所有笔记本电脑、智能手机、平板电脑都支持WiFi上网。通过
WiFi,设备可在有无线信号覆盖的区域接入互联网,节省流量费。许多地方实施“无线城市”工程,大学也提供WiFi信号供师生使用。WiFi的主要应用WiFi是一种基于IEEE802.11标准的无线局域网技术,起始于1997年。其通信距离约100米,发射功率约18dbm。从WiFi0到WiFi7,工作频段从2.4GHz扩展到2.4GHz、5GHz、6GHz,速率从2Mbps提升到30Mbps。WiFi的起源与技术指标8.1.1WiFi概述4/50与终端相关的基本概念WiFi热点:无线接入点(AP),可将互联网信号转换为WiFi信号,使附近设备接入互联网。服务集标识(SSID):WiFi终端可通过AT指令获取接入点的
SSID,从而确定接入的热点。WiFi密码:用于保护无线网络安全,WiFi
终端需输入密码才能连接。WiFi频段:主要有2.4GHz和5GHz两个频段,2.4GHz覆盖广、穿透强但易干扰,5GHz速度快、干扰少但覆盖小。WiFi客户端:连接到WiFi热点的设备,如智能手机、平板电脑等。WiFi热点分配的IP地址:终端连接热点后,热点通过DHCP分配IP地址。MAC地址:WiFi
设备的唯一标识,类似于手机的SIM卡号。与信息邮局MPO相关的基本概念IP地址:互联网上主机的唯一标识,由网络号和主机号组成,IPv4地址为32位,分为4段,每段8位。端口号:用于区分不同网络服务,一台主机可提供多种服务,通过“IP
地址+端口号”区分。互联网:全球性的计算机网络系统,由多个物理网络、路由器、服务器和终端设备组成,通过TCP/IP协议实现数据传输。与人机交互系统HCI相关的基本概念侦听程序与云服务器:云服务器是具有固定IP地址的计算机,运行侦听程序接收终端数据并存储到数据库,同时负责将人机交互系统的数据发送给终端。数据库:存储数据的地方,由表组成,每张表由字段组成,对数据库的操作包括增、删、改、查。客户端:与服务器相对应,为客户提供本地服务的程序,如网页浏览器、即时通讯软件等。0102038.1.22WiFi通信过程与应用开发相关的基本概念5/50物联网应用开发所面临的问题01.物联网应用开发涉及多学科知识,技术门槛高,开发周期长,成本高,稳定性难以保证。开发过程中需要软硬件协同设计,涉及实时性要求、抗干扰性与稳定性,且需不断进行软硬联合测试。解决物联网应用开发所面临难题的基本思路02.从技术科学层面,研究抽象物联网应用系统的技术共性,形成可复用、可移植的构件、类、框架,实现整体建模,合理分层,达到软硬可复用与可移植的目的。通过给出物联网智能系统的应用架构及应用方法,使技术人员可以在此模板基础上进行特定应用的开发,有效降低技术门槛。8.1.3物联网应用开发所面临的问题及解决思路6/50金葫芦WiFi开发套件从实际产品可用角度设计终端UE板,注重文档撰写,提供规范的模板。其设计思想包括立即检验WiFi通信状况、透明理解WiFi通信流程、实现复杂问题简单化、兼顾物联网应用系统的完整性、考虑组件的可增加性及环境多样性、考虑“照葫芦画瓢”的可操作性。AHL-CH32V303-WiFi的设计思想硬件部分包括5V转3.3V电源芯片、三色灯、CH32V303RCT6微控制器及TTL串口-USB芯片,WiFi
模块采用ESP8684H2芯片。硬件设计目标是将
MCU、通信模组、硬件最小系统集成在一个SOC片上,满足大部分终端UE产品的设计需求。AHL-CH32V303-WiFi的硬件资源软件资源包括终端用户程序、云侦听程序、Web
网页程序、微信小程序、远程更新程序等,提供完整的开发套件,支持快速应用开发。面向WiFi通信的软件资源8.1.4金葫芦WiFi开发套件简介7/500103028.1.4金葫芦WiFi开发套件简介8/50金葫芦WiFi开发套件的软件资源,见本书电子资源的【03-Software\CH08】文件夹,主要内容见表8-1。WiFi应用架构及通信基本过程实时操作系统应用开发技术PART-9/508.2从技术科学角度,抽取WiFi应用开发的技术共性,建立涵盖WiFi应用开发知识要素的应用架构,为实现快速规范的应用开发提供理论基础。遵循从个别到一般,再从一般到个别的哲学原理,建立抽象模型,为具体应用开发提供模板。8.2.1建立WiFi应用架构的基本原则10/50WiFi终端
UE:以微控制器为核心,具有数据采集、控制、运算等功能,带有WiFi通信功能的软硬件实体,用于实现特定功能。01WiFi信息邮局
MPO:基于WiFi协议的信息传送系统,运行云侦听程序,起信息传送的桥梁作用,提供固定IP地址与端口。02WiFi人机交互系统
HCI:实现人与WiFi信息邮局之间信息交互、处理与服务的软硬件系统,通过固定IP地址与端口实现与终端UE的信息传输。038.2.2终端UE、信息邮局MPO与人机交互系统HCI的基本定义11/50从应用层面来说,WiFi应用架构可以抽象为WiFi终端UE、WiFi信息邮局MPO、WiFi人机交互系统HCI三个组成部分,如图8-1所示,这种抽象为深入理解WiFi的应用层面开发共性提供理论基础。8.2.2终端UE、信息邮局MPO与人机交互系统HCI的基本定义12/50数据上行过程:终端UE通过WiFi热点将数据发送到云服务器,云服务器将数据存入数据库,人机交互系统从云服务器获取数据。01数据下行过程:人机交互系统将数据发送到云服务器,云服务器将数据发送到终端UE。028.2.3基于信息邮局初略了解基本通信过程13/50终端及云侦听模板的适应性修改实时操作系统应用开发技术PART-14/508.3终端UE程序中需设定WiFi网络名称与密码,以便连接到WiFi热点。这些信息在终端工程的
includes.h
文件中设定。WiFi连接的网络名称与密码终端程序要访问的IP地址与端口在
includes.h
文件中设定,IP
地址是WiFi共享的网段,端口可自行设定。终端要访问的IP地址与端口运行终端程序时,需确保周围没有其他人运行相同程序,否则WiFi网络名称会发生冲突。建议修改程序后再运行观察现象。运行过程注意点0102038.3.1了解终端UE程序中的通信接口信息15/50终端程序中WiFi名称与密码修改处8.3.1了解终端UE程序中的通信接口信息16/50终端程序中要访问的IP地址及端口修改处云侦听程序中还有一个服务于人机交互系统的端口,通过WebSocket协议实现通信,需在AHL.xml文件中设定。云侦听程序CS-Monitor运行的计算机的地址是终端要访问的IP地址,服务于终端的端口在AHL.xml文件中设定,需与终端程序中的端口设置一致。0102云侦听程序CS-Monitor服务于终端的端口云侦听程序CS-Monitor服务于人机交互系统的端口8.3.2了解云侦听程序的通信接口信息17/50<!--【2.2】指定WebSocket服务器地址和端口号与二级目录地址--><!--【2.2.1】指定WebSocket服务器地址和端口号--><WebSocketTarget>ws://:32226</WebSocketTarget><!--【2.2.2】指定WebSocket服务器二级目录地址--><WebSocketDirection>/wsServicesvx/</WebSocketDirection>02云侦听程序CS-Monitor服务于人机交互系统的端口8.3.2了解云侦听程序的通信接口信息18/50复制终端模板并修改下载运行下载后运行,若PC机移动热点未打开,屏幕会显示希望接入的WiFi网络名称及密码信息。开通笔记本电脑的移动热点后,终端UE会连接到热点,但尚未连接到云侦听程序。将终端模板程序复制并改名,修改
includes.h
文件中的端口、WiFi
名称和密码,删除Debug文件夹,编译下载运行。8.3.3运行自己的终端程序19/50将云侦听模板程序复制并改名,修改AHL.xml文件中面向终端UE和人机交互系统的端口。复制云侦听模板并修改运行云侦听程序,等待终端UE发送数据,云侦听程序会收到并显示出终端UE发来的数据。可通过云平台回发数据给终端UE,终端UE接收到回发的数据后会解析并改变自身信息。基本操作步骤IMSI号是WiFi终端的唯一标识,用于与NB-IoT、Cat1、4G等通信方式的编程一致,采用AHL后接MAC地址作为通信时WiFi终端的标识。关于使用IMSI号的说明0102038.3.4运行自己的云侦听程序并连接终端UE20/508.3.4运行自己的云侦听程序并连接终端UE21/50运行04_Resource\AHL.xml文件,等待数秒后,系统会弹出云侦听程序的界面,如图8-8所示。8.3.4运行自己的云侦听程序并连接终端UE22/50运行云侦听程序后,终端UE就可以连接到云侦听程序。等待数秒,云侦听程序就会收到并显示出终端UE发来的数据。如图8-9所示。8.3.4运行自己的云侦听程序并连接终端UE23/50在点击回发数据后等待15秒,云侦听程序会接受到终端数据发送的数据帧,如图8-10所示。011.终端新增一个物联量步骤在终端程序中,增加变量声明、初始化红灯、在初始化用户数据帧结构体函数中给出变量赋初值、根据接收到的状态变量控制红灯,编译并下载运行。022.云端新增一个物联量的步骤在云侦听程序中,添加变量名和显示名,将变量添加至命令“U0”中,运行CS-Monitor测试控制红灯。8.3.5新增一个物理量的方法24/50终端新增一个物联量步骤028.3.5新增一个物理量的方法25/503.运行CS-Monitor测试控制红灯使用“服务器资源管理器”查看数据库,通过“添加连接”选择数据库文件AHL-IoT.mdf,查看数据表Up、Down和Device。设备信息表(Device):存储终端设备的配置信息,记录与设备配置相关的信息。上行数据表(Up):存储所有上行的数据,通过命令确定真正有用的字段。下行数据表(Down):存储所有的下行数据,结构与上行数据表一致。使用封装好的数据库操作类SQLCommand,通过获取数据库连接字符串、创建数据库操纵对象,完成对数据库中表的基本操作,如新增、删除、修改、查询数据。1.查看数据库与表的简单方法2.各数据表的用途3.操作数据库的基本编程方法8.3.6了解数据入库过程26/50设备信息表(Device):存储终端设备的配置信息,记录与设备配置相关的信息。上行数据表(Up):存储所有上行的数据,通过命令确定真正有用的字段。下行数据表(Down):存储所有的下行数据,结构与上行数据表一致。2.各数据表的用途8.3.6了解数据入库过程27/508.3.6了解数据入库过程28/50设备信息表(Device):存储终端设备的配置信息,记录与设备配置相关的信息。上行数据表(Up):存储所有上行的数据,通过命令确定真正有用的字段。下行数据表(Down):存储所有的下行数据,结构与上行数据表一致。2.各数据表的用途运行Web网页实时操作系统应用开发技术PART-29/508.41.Web网页程序的适应性修改将Web网页模板程序拷贝并改名,修改
Web.config
文件中的端口配置,与云侦听程序的WebSocket服务器地址和端口号保持一致。2.运行Web网页程序观察终端实时数据运行终端程序、云侦听程序和Web网页程序,观察终端实时数据。若无数据,需排查移动热点、云侦听界面数据、接口设置等问题。3.终端增加一个红灯后Web页面实时数据对于增加红灯物理量的终端和云侦听程序,Web
网页程序无需修改,即可实现对新增物理量的显示。4.运行Web网页程序注意点在多人同时进行实验时,需按照约定规则设定WiFi网络名称、端口号,避免冲突。8.4.1运行Web源码访问终端UE的数据30/50Web网页“实时数据”页面与终端UE8.4.1运行Web源码访问终端UE的数据31/50具有红灯状态显示的Web实时数据页面在正确运行终端程序、云侦听程序的基础上,运行Web网页程序“Web-LX1-16667”。UE-LX2、CS-LX2正确运行后,仍然运行网页程序Web-LX1-16667,1.添加小灯控制按钮在Web网页程序中添加控制红灯的按钮标签,设置按钮的data-action属性,用于控制红灯的亮灭。2.编写设置小灯按钮的
light_set
事件编写light_set事件处理函数,根据按钮的data-action属性值设置回发命令中关于控制红灯的信息。3.运行Web程序测试控制红灯运行终端程序、云侦听程序和Web程序,测试控制红灯的功能,观察红灯状态的变化。8.4.2在实时数据页面增加控制按钮32/501.添加小灯控制按钮在工程的03_Web\realtime.aspx页面程序中,搜索“【画瓢处1】”的位置,添加新增两个按钮的标签,分别用来控制红灯物理量的亮灭。。8.4.2在实时数据页面增加控制按钮33/50<%--【画瓢处1】添加用户自己的按钮--%><inputid="btn_lighton"class="span2offset8"style="margin-right:70px;"type="button"value="点亮"data-action="on"onclick="light_set(this)"/><inputid="btn_lightoff"class="span2offset10"style="margin-right:70px;"type="button"value="熄灭"data-action="off"onclick="light_set(this)"/>2.编写设置小灯按钮的
light_set
事件在工程的03_Web\realtime.aspx页面程序中,搜索“【画瓢处2】”的位置,添加light_set事件的相关代码,用以处理当用户点击按钮时执行回发控制命令。8.4.2在实时数据页面增加控制按钮34/50<%--【画瓢处2】添加开、关灯按钮事件--%>//=======================================================================//函数名称:light_set//函数参数:无//函数返回:无//函数说明:button为按钮元素本身,利用它来获取按钮身上的各种属性信息//button.data.action=”off”时熄灭小灯,button.data.action=”on”时点亮小灯//=================================================functionlight_set(button){//先将控件全部清除
flag=0;//将全局标志初始化为0varjsonObj=JSON.parse(g_JSon);varobj=jsonObj["data"];varcount=obj.length;//遍历获取文本框中当前值//如果是小灯状态,则
if(obj[i].name=="redlight_state"){if(button.dataset.action==="on")obj[i].value="1";if(button.dataset.action==="off")obj[i].value="0";}}//回发的JSON格式
jsonObj["command"]="send";//回发命令“send”jsonObj["source"]="web";//来源“web”jsonObj["dest"]=g_IMSI;jsonObj["password"]="";varlast=JSON.stringify(jsonObj);//转换为JSON格式发送
ws.send(last);$("#inf_states").html("数据已回发");}for(vari=0;i<count;i++){varstr="#txt_"+obj[i].name;if(str=="#txt_currentTime"){vartimestamp=Date.parse(newDate())+8*3600*1000;obj[i].value=(""+timestamp).slice(0,10);}elseif(str=="#txt_mcuTemp"){vartemp=parseFloat($(str).val())*10+"";obj[i].value=temp;}else{obj[i].value=$(str).val();}3.运行Web程序测试控制红灯运行8.3.5添加了红灯物理量的终端程序【UE-LX2-87654321-16666】和云侦听程序【CS-LX2-16666-16667】以及本节添加了红灯控制按钮的Web程序,出现如图8-14所示的结果,界面中增加了“点亮”和“熄灭”的按钮。8.4.2在实时数据页面增加控制按钮35/50通过WebSocket建立连接,接收云侦听程序推送的数据,解析数据获取物理量信息。数据获取:与云侦听程序实时交互01根据数据结构动态生成前端展示控件,更新控件的值以显示最新设备状态。动态展示:控件的生成与数据填充02使用ECharts绘制图表,增强数据展示的直观性。可视化展示:图表化物理量03允许用户修改参数并通过WebSocket回发到服务器,实现双向交互。数据交互:参数的修改与提交048.4.3如何在Web网页程序中找到对应物联量36/50运行微信小程序实时操作系统应用开发技术PART-37/508.501微信小程序的开发环境为微信开发者工具,可从
/debug/wxadoc/dev/devtools/download.html下载安装。”8.5.1下载安装微信开发者工具38/501.进入微信小程序开发环境首次导入工程,可采用游客模式进入开发环境,导入工程文件夹,创建项目。微信小程序开发环境包括模拟器视图、编辑器视图和调试器视图,通过视图开关选择显示区域。2.了解编辑界面修改app.js文件中的WebSocket服务器地址和端口号,与云侦听程序的设置保持一致。3.修改配置文件中的通信接口信息8.5.2打开微信小程序源码39/5018.5.2打开微信小程序源码40/50微信小程序工程视图8.5.3运行微信小程序观察终端实时数据41/50添加小灯控制按钮在微信小程序页面程序中添加控制红灯的按钮标签,设置按钮的data-action属性。编写设置小灯控制按钮事件编写点击控制小灯按钮的事件处理函数,根据按钮的data-action属性值设置回发命令。运行微信小程序测试控制红灯运行终端程序、云侦听程序和微信小程序,测试控制红灯的功能,观察红灯状态的变化。0102038.5.4在实时数据页面增加按钮42/508.5.4在实时数据页面增加按钮43/50运行8.3.5添加了红灯物理量的终端程序和云侦听程序以及本节添加了红灯控制按钮的Web程序,出现如图8-19所示的结果,界面中增加了“点亮”和“熄灭”的按钮。若终端设备上的红灯为亮,点击“熄灭”按钮并等待命令回发完成,观察到终端设备红灯变暗;反之亦然。通过WebSocket建立连接,接收云侦听程序推送的数据,解析数据获取物理量信息。01在微信小程序中,通过数据绑定实现数据展示,动态显示物理量的实时数据。02数据获取:与云侦听程序实时交互数据展示8.5.5如何在微信小程序中找到对应物联量44/50远程更新终端UE程序实时操作系统应用开发技术PART-45/508.6远程更新是通过网络连接将软件代码从服务器传输到客户端设备中,涉及客户端和服务器通信、验证完整性、更新应用和重启等步骤。+8.6.1远程更新概述46/50打开远程更新软件,选择BIOS更新或User更新,输入服务器IP地址和端口号,点击开启侦听按钮,等待获取WiFi终端UE的MAC地址。1.运行远程更新程序成功获取MAC地址后,点击“连接GEC”,导入需要更新的BIOS程序或User程序的.hex文件,点击“一键自动更新”,完成更新操作。2.连接终端并更新程序在BIOS更新过程中,WiFi
终端UE中的User程序会被擦除,因此BIOS更新完成后需进一步更新User程序。3.注意事项8.6.2远程更新操作过程47/50成功获取到WiFi终端UE的MAC地址后,点击【连接GEC】,远程更新软件会与该WiFi终端UE重新建立连接,成功连接后点击【选择文件】,导入需要更新的BIOS程序或User程序的.hex文件,点击【一键自动更新】,远程更新软件将选定的BIOS程序或User程序更新至WiFi终端UE中,如图8-21所示。+8.6.2远程更新操作过程48/50等待数据检测,若出现数据丢失的情况,则会进行丢帧补发,直至程序全部更新完成。若进行User更新,则等待更新完成即可若进行BIOS更新,等待BIOS更新完成后,继续执行第4步,导入User程序的.hex文件进行更新。更新成功后将进入User程序,如图8-22所示。+8.6.2远程更新操作过程49/50实时操作系统应用开发技术谢谢大家主讲人:王宜怀时间:2025.650/50实时操作系统应用开发技术LiteOS
在CH32V303
上的移植方法主讲人:王宜怀时间:2025.61/18A.1下载轻量级鸿蒙LiteOS的最新版源码A.2将LiteOS最新源码加入NOS工程中A.3对源代码进行修改A.4移植后测试目录01020304CONTENTS2/18下载轻量级鸿蒙
LiteOS的最新版源码实时操作系统应用开发技术A.1PART-3/18输入网址登录账号0102在浏览器地址栏输入liteos-m代码仓库网址:/openharmony/kernel_liteos_m。若无账号点击“注册”创建,已有账号点击“登录”输入账号密码。A.1.1进入代码仓库4/18登录后进入网址,点击“克隆/下载”界面的“下载”按钮。点击“版本”→“选择版本”,选择OpenHarmony-v5.0-Beta1版本。点击下载按钮选择版本A.1.2下载源代码5/18下载后得到名为“kernel_liteos_m-OpenHarmony-v5.0-Beta1.zip”的压缩文件,解压后为操作系统源码文件。文件内容A.1.3源码文件说明6/18将LiteOS
最新源码加入NOS工程中实时操作系统应用开发技术A.2PART-7/18双击下载的压缩文件,新建“LiteOS”文件夹并解压。解压文件复制电子资源中的“NOS-Frame-CH32V303”文件夹,改名为“LiteOS-Frame-CH32V303-5.0”,将“LiteOS”文件夹复制到其中。复制文件夹A.2解压与复制8/18进行工程修改,将无操作系统NOS工程变为带
LiteOS
的应用工程。修改工程A.3工程修改9/18对源代码进行修改实时操作系统应用开发技术A.3PART-10/18删除文件夹删除arch文件夹下多余处理器内核文件夹、testsuites、figures、drivers、components中非必需组件、tools文件夹。修改文件夹对kal文件夹进行更改,删除libc、libsec、posix文件夹;对kal/cmsis文件夹进行更改,删除cmsis_os.h、hos_cmsis_adp.h、cmsis_os2.h文件。删除其他文件删除无用的git文件和脚本文件。A.3.1删除无用代码11/18通过阅读内核代码,发现时间管理中存在ArchTickTimer结构体,相关功能通过调用该结构体成员变量实现。关键代码解读修改SysTickStart、SysTickLock、SysTickUnlock、SysTickCycleGet、SysTickReload函数,确保定时器正确设定SysTick行为。定时器功能函数修改修改arch/riscv/nuclei/gcc/los_timer.c文件中g_archTickTimer结构体成员变量,适配CH32V303。修改全局定时器定义修改SysTick_Handler函数,使其在MCU产生定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专业化学业就业指导
- 工程项目设计优化方法案例及其实施方案样本
- 胶束凝聚态模拟
- 自动化灌溉系统优化设计
- 企业运营风险管控承诺书9篇
- 亲子木工培训大纲
- 出版物出版保障承诺书(5篇)
- 城市口袋公园冬季景观视觉质量提升设计SD法
- 物品健康宣教
- 新生儿医患关系视频
- 2026年春人教版(2024)八年级下册英语期末检测试卷(含答案)
- 2026江苏南京师范大学专业技术人员招聘10人备考题库附答案详解【考试直接用】
- 2026届高考语文复习:“立人者自立成人者成己”作文写作指导 课件
- 哈尔滨市第三中学 2026 年高三学年第二次模拟考试英语+答案
- 2026年金华永康市粮食收储有限责任公司公开招聘合同制员工9人考试备考试题及答案解析
- 2026年青岛华通国有资本运营集团有限责任公司校园招聘笔试备考试题及答案解析
- 重庆市康德2026届高三高考模拟调研卷(三)政治试卷(含答案详解)
- 2026年电子行业:量子计算新范式加速算力新革命
- 安康职业技术学院《基础医学选论》2025-2026学年第一学期期末试卷
- 【自考练习题】辽宁工业大学概率论与数理统计真题汇总(附答案解析)
- 静净敬竞主题班会
评论
0/150
提交评论