实时操作系统应用开发技术 课件 第1-5章RTOS基本概念与线程基础知识-底层驱动构件_第1页
实时操作系统应用开发技术 课件 第1-5章RTOS基本概念与线程基础知识-底层驱动构件_第2页
实时操作系统应用开发技术 课件 第1-5章RTOS基本概念与线程基础知识-底层驱动构件_第3页
实时操作系统应用开发技术 课件 第1-5章RTOS基本概念与线程基础知识-底层驱动构件_第4页
实时操作系统应用开发技术 课件 第1-5章RTOS基本概念与线程基础知识-底层驱动构件_第5页
已阅读5页,还剩147页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实时操作系统应用开发技术第1章RTOS的基本概念与线程基础知识主讲人:王宜怀时间:2025.061.1实时操作系统的基本含义1.2RTOS中的基本概念1.3线程的三要素、四种状态及三种基本形式目录-CONTENTS1.4本章小结实时操作系统的基本含义1.1PART-实时操作系统应用开发技术1.1.1无操作系统与实时操作系统无操作系统下程序运行流程01.无操作系统运行机制无操作系统(NOS)的嵌入式系统在复位后初始化硬件模块,进入无限循环,由全局变量决定执行功能程序。发生中断时,执行中断服务例程(ISR),完成后返回中断处继续执行。NOS中主程序类似实时操作系统内核,负责调度其他“线程”。这种运行方式简单直接,但缺乏灵活性和复杂任务处理能力。RTOS下程序运行流程02.RTOS程序运行机制实时操作系统(RTOS)是面向实时性要求高的工业控制领域智能化产品的系统软件,属于单进程多线程系统。RTOS内核负责线程调度,程序运行分为线程线和中断线。线程是RTOS下程序运行的基本单元,调度者(RTOS内核)决定线程何时运行;中断线与无操作系统情况一致。这种机制使RTOS能够高效处理多任务和中断。RTOS的基本功能03.RTOS核心功能RTOS的基本功能包括线程管理与调度、线程间的同步与通信、存储管理、时间管理和中断管理。RTOS为每个线程建立可执行环境,管理线程间的消息传递,区分线程优先级,协调多个线程对同一个I/O设备的调用,这些功能使RTOS能够满足复杂系统的实时性需求。RTOS的应用场合04.RTOS使用场景是否使用RTOS需根据系统复杂性、硬件资源、线程交互需求和软件可移植性综合考虑。RTOS适用于对实时性要求高的嵌入式系统,如工业控制设备、军事设备和航空航天设备。以轻量级鸿蒙LiteOS为例,它是一款面向工业智能化及物联网领域的国产开源免费RTOS,这些应用场合对实时性和可靠性要求极高。4/19操作系统(OS)是管理计算机硬件与软件资源的程序,是计算机的系统软件。桌面操作系统如Windows、MacOS、Linux等,提供硬件设备驱动管理及用户软件进程管理等功能。嵌入式操作系统工作在嵌入式微型计算机上,负责软硬件资源分配、线程调度等功能。操作系统概述资源较丰富的应用处理器使用的嵌入式操作系统对实时性要求不高,如Android、iOS、Linux等;以微控制器为核心的嵌入式系统对实时性要求较高,如轻量级鸿蒙LiteOS、RT-Thread、FreeRTOS等。与通用操作系统相比,RTOS注重每个实时线程在最坏情况下满足实时性要求。实时与非实时操作系统1.1.2实时操作系统与非实时操作系统5/19RTOS中的基本概念1.2PART-实时操作系统应用开发技术1、线程的基本含义线程是RTOS中最重要的概念之一,是RTOS调度的基本单元。从不同视角理解线程:从线程调度视角看,它是RTOS调度的基本单元;从软件设计视角看,它是独立的、相互作用的程序集合;从CPU运行视角看,它是占用CPU的主体。2、调度的基本含义调度是RTOS内核的重要职责,负责为每个线程分配CPU时间。线程根据重要程度被赋予优先级,RTOS大多采用基于优先级的调度算法,让处于就绪态的优先级最高的线程先运行。1.2.1线程与调度的基本含义7/19时钟节拍是特定的周期性中断,通过定时器产生,以便内核判断是否有更高优先级的线程进入就绪状态。代码临界段不可抢占型内核与可抢占型内核实时性及RTOS实时性指标实时性是系统在规定时间内的反应能力,RTOS包括硬实时和软实时。评价RTOS可从线程调度时间指标(调度延时、线程切换时间)、中断禁止时间与中断延迟时间、最小内存开销等方面衡量。01时钟节拍不可抢占型内核要求每个线程主动放弃CPU使用权,异步事件由中断服务处理,但使用权仍回到原线程,直到其主动放弃。可抢占型内核中,运行的线程可被打断,让优先级高的线程运行。代码临界段是运行时不可分割的代码,执行时不允许中断打扰。为确保临界段代码执行,进入临界段前要关中断,执行完后开中断。0203041.2.2内核类其他基本概念8/191、线程的上下文及线程切换线程的上下文是某一时间点CPU内部寄存器的内容。线程切换是内核保存当前线程上下文,从堆栈中恢复下一个线程上下文,开始运行新线程的过程。2、线程优先级多线程系统中,每个线程有优先级,RTOS根据优先级调度,优先级高的线程先运行。优先级反转是高优先级线程等待低优先级线程释放资源的现象,优先级继承可解决此问题。RTOS中的资源是被线程占用的实体,包括输入/输出设备、变量、结构体等。涉及共享资源、互斥与死锁等概念。4、资源线程间通信是线程间信息交换,实现线程间同步及数据传输,方式有事件、消息队列、信号量、互斥量等。3、线程间通信1.2.3线程类其他基本概念9/19线程的三要素、四种状态及三种基本形式1.3PART-实时操作系统应用开发技术01线程函数是线程要完成具体功能的程序,存储在Flash区。线程函数需“登记”,设定优先级、堆栈大小、编号等,才能被RTOS内核调度运行。线程函数02线程堆栈是独立于线程函数的RAM,按“先进后出”策略组织,用于保存线程运行过程中的局部变量、返回地址、上下文等。线程堆栈03线程描述符是关联线程属性的程序控制块,记录线程的各个属性。多个线程的线程描述符组成链表,存储于RAM中,RTOS通过线程描述符管理线程。线程描述符1.3.1线程的三要素11/19(1)终止态(Terminated,Inactive):线程已经完成或被删除,不再需要使用CPU。(2)阻塞态(Blocked):又可称为“挂起态”。线程未准备好,不能被激活,因为该线程需要等待一段时间或某些情况发生;当等待时间到或等待的情况发生时,该线程才变为就绪态,处于阻塞态的线程描述符存放于等待列表或延时列表中。(3)就绪态(Ready):线程已经准备好可以被激活,但未进入激活态,因为其优先级等于或低于当前的激活线程,一旦获取CPU的使用权就可以进入激活态,处于就绪态的线程描述符存放于就绪列表中。(4)激活态(Active,Running):又称“运行态”,该线程在运行中,线程拥有CPU使用权。1、线程状态的基本含义1.3.2线程的四种状态12/19RTOS线程的四种状态是动态转换的,有的情况是系统调度自动完成,有的情况是用户调用某个系统函数完成,有的情况是等待某个条件满足后完成。。2、线程状态之间的转换1.3.2线程的四种状态13/191.3.3线程的三种基本形式1.单次执行线程单次执行线程是创建后仅执行一次、完成后即被销毁或阻塞的线程,其函数结构包含初始化、执行和销毁或阻塞三部分。初始化部分负责变量定义与赋值、打开所需设备等;执行部分实现线程的基本功能;销毁或阻塞部分则通过调用相应函数将线程从列表中移除,其中销毁会停止线程运行并回收堆栈空间等所有资源,阻塞仅设置线程描述符状态为阻塞。voidthread_a(uint32_tinitial_data){ //初始化部分 //线程体部分

//线程函数销毁或阻塞}线程函数结构如下:14/191.3.3线程的三种基本形式2.周期执行线程周期执行线程是需按一定周期重复执行的线程,其函数结构的初始化部分与单次执行线程相同,包括变量定义赋值、打开设备等操作;不同之处在于,周期执行线程的函数体包含永久循环,且线程内通常通过延时函数、等待事件或消息等代码主动进入阻塞状态,待条件满足后重新进入就绪态,以此实现周期性的执行逻辑。voidthread_a(uint32_tinitial_data){ //初始化部分 …… //线程体部分

while(1) { //循环体部分 }}线程函数结构如下:15/191.3.3线程的三种基本形式3.资源驱动线程资源驱动线程是操作系统特有的一种线程形式,其资源指信号量、事件等线程通信与同步方法。该线程的执行时间不确定,只有等待的资源可用时才转入就绪态,否则加入等待列表。其函数结构的初始化和线程体部分与单次、周期执行线程类似,主要区别在于在线程体执行前会调用等待资源函数,以等待资源实现线程体功能。这种线程因操作系统下的资源共享使用问题而产生,也引出了线程同步与通信问题。voidthread_a(uint32_tinitial_data){ //初始化部分

…… while(1) { //调用等待资源函数

//线程体部分}线程函数结构如下:16/19本章小结1.4PART-实时操作系统应用开发技术01RTOS下编程与NOS下编程相比,有调度者指挥协调线程运行,可将大工程分解为小工程,符合软件工程原理。02线程是RTOS中重要概念,是RTOS调度的基本单元,是应用程序设计时划分出的独立、相互作用的程序集合,是单CPU下占用CPU运行的程序。线程可能被称为任务等,本质不变。03线程有终止态、阻塞态、就绪态、激活态四种状态,状态之间可相互转换。线程有单次执行、周期执行、资源驱动三种基本形式。18/19谢谢大家实时操作系统应用开发技术实时操作系统应用开发技术第2章LiteOS第一个样例工程时间:2025.06主讲人:王宜怀目录CONTENT2.32.12.22.4轻量级鸿蒙LiteOS的第一个样例工程

LiteOS简介软硬件开发平台本章小结

LiteOS简介2.1PART-实时操作系统应用开发技术LiteOS定义与应用LiteOS是华为2015年推出的轻量级开源实时操作系统,专为低功耗、低内存、低成本物联网设备设计,支持多种芯片架构和设备类型,提供丰富开发工具和软件库,广泛应用于智能家居、个人穿戴、车联网等领域。2.1.1LiteOS概述23/25开源免费与社区支持遵循BSD-3开源许可协议,源码免费下载,有活跃社区支持。易懂易移植主要用C语言编写,代码简洁高效,模块化设计,支持多种处理器架构。可裁剪性强基础内核体积可裁剪至不到10K,允许开发者根据需求对系统功能进行静态裁剪。资源占用小、功耗低相较于Linux,体积小、成本低、功耗低、启动快速,具有高实时性。2.1.2LiteOS基本特点24/25源码获取与更新华为官网可下载OpenHarmonyLiteOS-M内核版本更新工程,包含应用程序样例、基础软硬件服务子系统集、配置脚本、说明文档等文件,具体更新方法见附录A。2.1.3如何下载与更新LiteOS源码25/25

软硬件开发平台2.2PART-实时操作系统应用开发技术电子资源内容本书配有网上电子资源AHL-CH32V303-LiteOS,包含文档文件夹、硬件文件夹、软件文件夹、工具文件夹,可在苏州大学嵌入式学习社区官网下载。2.2.1下载网上电子资源27/251、为什么需要硬件平台嵌入式软件开发依赖交叉编译调试环境(PC编译、目标机执行),因体系结构差异增加开发难度,需选好开发套件。学习RTOS建议用实际硬件平台而非仿真环境,如今低价高性能的RTOS学习平台已普及。2、金葫芦WiFi开发套件的硬件资源金葫芦AHL-CH32V303-WiFi套件集成CH32V303RCT6主控、ESP8684H2WiFi芯片,正反分置最小系统与WiFi模块,配Type-C接口。出厂预装BIOS及检测程序,支持LiteOS开发与物联网实践,配套静态库、模板与开源代码,加速终端设计。3、AHL-CH32V303-WiFi开发板的特点本书的AHL-CH32V303-WiFi开发套件,核心芯片为CH32V303RCT6,集成多种功能模块;硬件含最小系统、三色灯等并引出全部MCU引脚;Type-C接口兼具程序下载与printf调试功能;适用于LiteOS学习,还可外接模块创新实验,其工程框架也可供其他硬件平台参考。2.2.2硬件平台:AHL-CH32V303-WiFi28/252.2.3AHL-CH32V303-WiFi开发板的测试步骤1使用标准Type-C数据线①给主板供电。步骤2观察蓝灯是否闪烁。步骤3编辑移动热点的网络信息。步骤4打开移动热点。29/2501021、AHL-GEC-IDE苏州大学嵌入式实验室推出的免费嵌入式集成开发环境,操作简单、功能实用,兼容多个芯片公司的常用开发环境及厂家工程模板,支持串口下载调试,具备外接软件功能、丰富的常用工具、简化工程配置、可扩展功能。2、MounRiverStudio针对RISC-V/ARM双核MCU的免费嵌入式集成开发环境,提供完整开发资源,具有编辑、编译和调试等功能。2.2.4软件平台:金葫芦集成开发环境30/25轻量级鸿蒙LiteOS的第一个样例工程2.3PART-实时操作系统应用开发技术硬件与软件功能样例程序硬件为红、绿、蓝三色一体发光二极管,由三个GPIO引脚控制其亮暗,软件控制红灯每5s、绿灯每10s、蓝灯每20s变化一次,表现为三色灯的合成色。2.3.1样例程序功能32/252.3.2工程框架设计原则框架定义基本原则工程框架是指工程内文件夹的命名、文件的存放位置、文件内容的放置规则。分门别类,各有归处,建立工程文件夹,并考虑随后内容安排及内容定位,建立其下级子文件夹。33/252.3.3NOS工程框架MCU文件夹把链接文件、MCU的启动文件、MCU底层驱动(MCU底层驱动构件)放入这个文件夹中,建立三个下级文件夹。linker_file文件夹内的链接文件,给出了芯片存储器的基本信息;startup文件夹含有芯片的启动文件;MCU_drivers存放与MCU硬件直接相关的底层驱动构件。用户板文件夹在产品开发中,开发者选定MCU后设计的硬件板即用户板,其上通常配置LCD、传感器、开关等硬件,这些硬件需软件干预才能运行。用于干预的软件构件称为外部设备构件,其运行一般需调用MCU底层驱动构件,且外部设备构件通常放置在用户板文件夹中。应用程序文件夹应用程序文件夹包含总头文件(includes.h)、中断服务例程源程序文件(isr.c)、主程序文件(main.c)等核心编程文件。编译输出还会产生“Debug”文件夹。含有编译链接生成的.elf、.hex、.list、.map等文件。1.

NOS工程框架的树形结构34/252.3.3NOS工程框架2.NOS样例工程运行测试35/252.3.3NOS工程框架3.NOS样例工程的main函数及isr函数线程线(主程序)程序通过计数变量mCount的切换来控制三色小灯的开关状态,实现全暗、红色、绿色、黄色、蓝色、紫色、青色、白色的周而复始的运行,同时通过串口输出灯的信息。0102用户串口接收一个字节,触发串口接收中断,在用户串口中断服务例程中,接收该字节,立即发回。中断线程36/251.LiteOS工程框架的树形结构2.3.4LiteOS工程框架LiteOS工程框架与NOS框架结构完全一致,差异在于:①05_UserBoard文件夹新增Os_Self_API.h(提供LiteOS接口函数)和Os_United_API.h(实现RTOS统一接口以支持移植);②各文件夹分工明确(01文档记录、02内核相关、03芯片驱动、04衔接BIOS与User、05用户硬件接口、06-07可移植复用);③07_AppPrg文件夹中,includes.h声明线程函数,main.c通过OS_start(thread_auto)启动系统,自启动线程thread_auto负责将蓝灯、绿灯、红灯线程函数纳入内核调度,形成多线程独立运行机制。37/252.LiteOS样例工程运行测试2.3.4LiteOS工程框架38/253.LiteOS的启动2.3.4LiteOS工程框架执行OS_start(thread_auto)进行LiteOS的启动,在启动过程中依次创建了自启动线程(thread_auto)和空闲线程(idle)。thread_auto源码是在本工程中直接给出的,idle被驻留在BIOS中,初步理解LiteOS一章将给出源码解析。39/254.自启动线程的执行过程2.3.4LiteOS工程框架功能概要自启动线程优先被内核调度,依次创建蓝灯、绿灯、红灯线程,分别实现20s、10s、5s间隔闪烁,创建后自身终止。此时就绪列表剩红、绿、蓝及空闲线程,红灯线程优先级最高先运行,调用延时函数时被移至延时列表。随后系统依次调度蓝灯、绿灯线程。当三用户线程均在延时列表时,空闲线程运行。基于1ms时钟嘀嗒中断实现调度切换,中断服务例程检查定时器,到期线程移回就绪列表抢占CPU,最终呈现与NOS样例工程相同效果。01源码解析thread_auto函数定义于07_AppPrg\threadauto_appinit.c,负责初始化及线程创建启动。通过thread_create函数创建红、蓝、绿灯线程,设1024字节堆栈、15优先级、20时钟嘀嗒时间片;利用thread_startup函数启动对应线程执行函数。这些函数以无限循环运行,由LiteOS调度分配CPU。0240/255.红灯、绿灯、蓝灯线程函数2.3.4LiteOS工程框架//==================================================================//函数名称:thread_redlight//函数返回:无//参数说明:无//功能概要:每5秒红灯反转//内部调用:无//==================================================================voidthread_redlight(){char*lightstate[8]={"【全暗】","【红色】","【绿色】","【黄色】=红+绿","【蓝色】","【紫色】=红+蓝","【青色】=蓝+绿","【白色】=红+蓝+绿"};staticuint8_ti=0;//静态变量(计数)

gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF);while(1){printf("当前指示灯颜色为%s\r\n",lightstate[i]);delay_ms(5000);//延时5秒

gpio_reverse(LIGHT_RED);i=i+1;if(i>=8)i=0;}}41/252.4本章小结04PART-实时操作系统应用开发技术学习RTOS的第一要素是实践,实践需要软硬件基础平台,本章介绍的硬件平台AHL-CH32V303及软件平台AHL-GEC-IDE满足RTOS学习与实践的基本要求,良好的工程组织是软件工程的基本要求,也是可移植、可复用、可维护的保证,本章实例展示了RTOS下的延时函数与运行机器码空延时的不同。实践与平台重要性43/25谢谢大家主讲人:王宜怀时间:2025.6实时操作系统应用开发技术第3章LiteOS下应用程序的基本要素主讲人:王宜怀时间:2025.6实时操作系统应用开发技术3.1中断基本概念及处理过程3.2时钟嘀嗒与延时函数3.3调度策略3.4LiteOS中的线程状态迁移说明01020304目录3.5本章小结05中断基本概念及处理过程3.1PART-实时操作系统应用开发技术1.中断基本概念3.3.1中断基本概念及处理过程中断与异常的基本含义中断是外部设备或硬件条件引起的程序切换,异常是内部错误或指令引起的切换。中断优先级高于异常,中断可被屏蔽,异常不可屏蔽。中断优先级分类中断优先级决定中断响应顺序,高优先级中断可打断低优先级中断。中断分为可屏蔽中断和不可屏蔽中断,可屏蔽中断可通过程序设置屏蔽,不可屏蔽中断不可关闭。中断源是引起中断的设备,中断服务例程是中断发生后执行的程序,中断向量号是中断源编号,中断向量表存放中断服务例程首地址。中断相关要素48/192.中断处理的基本过程1)中断请求当某一中断源需要CPU为其服务时,会向CPU发出中断请求信号。中断控制器获取中断源硬件设备的中断向量号,并将对应硬件模块的中断状态寄存器中的“中断请求位”置位,以便让CPU知道发生了何种中断请求。2)中断检测CPU在每条指令结束时检查中断请求或系统是否满足异常条件。多数CPU专门在指令周期中使用中断周期检测系统中是否有中断请求信号。若检测到中断请求信号,CPU暂停当前程序,转去响应中断请求;若无中断请求信号,则继续执行当前程序。3)中断响应过程中断响应过程由系统自动完成,对用户透明。首先,CPU查找中断源所对应的中断模式是否允许产生中断,若允许,则响应该中断请求,并保存当前环境的“上下文”于栈中;然后,通过中断向量号找到中断向量表中对应的ISR的首地址,转而去执行ISR。3.3.1中断基本概念及处理过程49/193.1.2CH32V303中断向量表及中断向量号宏定义1.CH32V303微控制器的中断向量表50/193.1.2CH32V303中断向量表及中断向量号宏定义2.CH32V303微控制器的中断向量号宏定义51/19时钟嘀嗒与延时函数3.2PART-实时操作系统应用开发技术时钟嘀嗒是LiteOS中时间的最小度量单位,也是线程调度的基本时间单元,主要用于系统计时、线程调度等。要进行线程切换,至少等一个时钟嘀嗒。时钟嘀嗒由硬件定时器产生,一般以毫秒为单位。在CH32V303内核中,时钟嘀嗒设置为1ms。3.2.1时钟嘀嗒53/193.3.2延时函数使用delay_ms函数时,需注意两点:一是delay_ms只能用在对时间精度要求不高或者时间间隔较长的场合,因为其延时时长参数以时钟嘀嗒为单位,当1个时钟嘀嗒大于1ms且对延时时长精度要求较高时,实际延时时间与希望延时时长可能会有误差;二是延时小于1个时钟嘀嗒时不使用delay_ms函数,而是根据具体延时时间采用其他更合理的方式。2.使用LiteOS下延时函数的注意点02在有操作系统的情况下,线程一般不采用原地空跑的方式进行延时,而是使用延时函数。LiteOS中的延时函数osDelay(宏定义为delay_ms)可让线程暂停执行,让出CPU使用权,并通过延时列表管理延时线程。执行该函数时,将当前线程的定时器按其延时参数指示的时间插入到延时列表的相应位置,该列表中的线程的定时器按照延时时长从小到大排序。在延时期间,该线程放弃CPU使用权,内核调度正常进行,可执行别的就绪线程。当延时时间到达时,线程进入就绪列表,等待LiteOS调度运行。1.LiteOS下延时函数的基本内涵0154/19调度策略3.3PART-实时操作系统应用开发技术3.3.1调度基础知识优先级抢占调度让就绪列表中优先级最高的线程先运行,优先级相同则采用先进先出策略。高优先级线程可抢占低优先级线程,线程阻塞后放弃CPU使用权,调度系统分配CPU给优先级最高的线程。优先级抢占调度时间片轮询调度让就绪列表中优先级最高的线程先运行,优先级相同的线程采用时间片轮转方式分享CPU时间,不同优先级线程按先进先出策略排列,相同优先级线程采用时间片轮询调用。时间片轮询调度56/19LiteOS主要采用优先级抢占式调度策略,总是将CPU的使用权分配给当前就绪的、优先级最高的且更早进入就绪态的线程。创建线程中的时间片参数实际并未使用,设置所有线程的时间片大小为0,不会进行时间片轮询调度。若未出现优先级抢占或者线程阻塞的情况,正在运行的线程不会主动放弃对CPU的使用权。3.3.2LiteOS中使用的调度策略57/19在内核启动之前,需要创建一个自启动线程,以便内核启动后执行它,并由它来创建其他用户线程。自启动线程的优先级为9,其状态为就绪态,会自动被放入到就绪列表中。自启动线程的优先级必须要高于或等于其他用户线程的优先级,这样才能保证其他用户线程被正常创建并运行。01自启动线程02为了确保在内核无用户线程可执行的时候,CPU能继续保持运行状态,就必须安排一个空闲线程。空闲线程不完成任何实际工作,其状态为就绪态,始终在就绪列表中。空闲线程是在内核启动的过程被创建的,其优先级为31,是所有线程中最低的。空闲线程3.3.3LiteOS中固有线程58/19LiteOS中的线程状态迁移说明3.4PART-实时操作系统应用开发技术运行中的线程运行结束,线程状态由激活态变为退出态。7.激活态转为终止态线程也有可能在就绪态时被阻塞,此时线程状态会由就绪态转变为阻塞态,该线程从就绪列表中删除,不会参与线程调度,直到该线程被恢复。5.就绪态转为阻塞态6.激活态转为就绪态有更高优先级线程创建或者恢复后,会发生线程调度,此刻就绪列表中最高优先级线程变为激活态,那么原先运行的线程由激活态变为就绪态,并加入就绪列表中。正在运行的线程发生阻塞(挂起、延时、读信号量等)时,线程状态由激活态变成阻塞态,然后发生线程切换,运行就绪列表中剩余最高优先级线程。3.激活态转为阻塞态阻塞的线程被恢复后(线程恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的线程会被加入就绪列表,从而由阻塞态变成就绪态。4.阻塞态转为就绪态在LiteOS中,当线程初始化完成,将线程插入就绪列表,此时线程进入就绪态,即就绪列表中的线程是即将运行的线程,随时准备被调度运行。1.初始态转为就绪态2.就绪态转为激活态如果任务不是处于阻塞态,则把其加入就绪列表。当内核调度器确认哪个线程运行,则将该线程状态标志由就绪态改为激活态,线程会从就绪列表中被取出并执行。此时如果被恢复线程的优先级高于正在运行线程的优先级,则会发生线程切换,将该线程由就绪态变成激活态。3.3.4线程状态迁移说明60/19

本章小结3.5PART-实时操作系统应用开发技术中断系统是核心,需明确芯片支持的中断源、触发条件及ISR编程位置,并通过user.h宏定义ISR名称确保可移植性;时钟嘀嗒(1ms)是调度基础单位,由硬件定时器产生,线程切换至少需等待一个时钟嘀嗒;延时函数(delay_ms)通过让出CPU使用权实现阻塞,仅适用于延时≥1时钟嘀嗒的场景,短延时需其他方式实现;调度策略以优先级抢占为主(高优先级立即运行,同优先级按FIFO执行),时间片轮转作为补充(同优先级分时共享CPU);线程管理依赖就绪列表组织就绪线程,并需理解线程状态迁移机制(如就绪态→激活态、阻塞态→就绪态等)。最终,LiteOS是服务应用程序的工具,深入理解上述要素方能高效利用其多线程并发能力,避免系统成为应用负担3.5本章小结62/19谢谢大家主讲人:王宜怀时间:2025.6实时操作系统应用开发技术第4章

LiteOS同步与通信技术主讲人:王宜怀时间:2025.6实时操作系统应用开发技术目录CONTENTRTOS中同步与通信基本概念4.1消息队列4.3事件4.2信号量4.4互斥量4.5RTOS中同步与通信基本概念4.1PART-实时操作系统应用开发技术1、同步的含义2、实现同步的通信手段RTOS提供多种通信手段,如事件、消息队列、信号量、互斥量等,适用于不同场合。从是否需要通信数据角度看,事件、信号量、互斥量适用于无需数据传输的同步;消息队列适用于既有同步功能又能传输数据的场景。从产生与使用数据速度角度看,消息队列适用于产生数据速度快于处理速度的情况,但需保证平均处理速度不低于产生速度。线程间配合称为同步,由条件触发。控制方发出信息,被控制方接收后进入就绪状态。线程间的同步过程通常由某种条件触发,称为条件同步。控制方发出信息,被控制方接收后状态改变,实现同步。4.1.1同步的含义与通信手段67/46中断服务例程产生同步信号,线程等待信号,信号发出后线程变为就绪状态。例如,小灯线程与串口接收中断相关联,串口接收中断收到完整数据帧时发出事件信号,小灯线程收到信号后进行灯的亮暗切换。两个线程之间的同步分为单向同步和双向同步。单向同步时,控制方线程发出信息后,被控制方线程进入就绪状态。若控制方优先级低于被控制方,瞬时同步效果较好;反之则较差。双向同步中,通信双方相互制约,生产者通过提供消息同步消费者,消费者通过回复消息同步生产者,达到产销平衡。3.两个以上线程同步一个线程采用事件按“逻辑与”实现,被同步线程的执行次数不超过各个同步线程中发出信号最少的线程的执行次数。“逻辑与”的控制功能具有安全控制的特点,可用来保障一个重要线程必须在万事俱备的前提下才可以执行。若干相关线程的运行频度保持一致,每个相关线程在运行到同步点时都必须等待其他线程,全部到达后按优先级顺序离开。多个线程相互同步保证在任何情况下各个线程的有效执行次数都相同,而且等于运行速度最低的线程的执行次数,具有团队作战的特点,适用于多线程配合的循环作业。4.多个线程相互同步2.两个线程之间的同步1.中断和线程之间的同步4.1.2同步类型68/46事件4.2PART-实时操作系统应用开发技术4.2.1事件的含义及应用场合事件是RTOS中用于协调线程间或中断与线程间同步的机制,不传送数据,只发同步信号,常用于线程需等待另一线程或中断信号才能继续工作的情况。事件适用于需多个信号逻辑运算后同步的场景,如串口接收完整数据帧后通知线程处理,实现中断服务例程与线程的高效协作。事件的定义应用场景70/461.创建事件变量函数event_create在使用事件之前必须调用创建事件函数创建一个事件控制块结构体变量。4.2.2事件的常用函数71/46当调用事件获取函数时,线程进入阻塞状态,等待32位事件字指定的一位或几位置位后退出阻塞状态。2.获取事件函数event_recv4.2.2事件的常用函数72/46发送事件函数用于发送事件字的指定事件位,事件位被置位后,因执行获取事件函数而进入阻塞列表的线程会退出阻塞状态,进入就绪列表,接受调度。3.发送事件函数event_send4.2.2事件的常用函数73/464.2.3事件的编程实例1.事件样例程序的功能(1)用户串口中断为收到一个字节产生中断,在“isr.c”文件的中断服务例程UART_User_Handler中,进行接收组帧。(2)当串口接收到一个完整的数据帧(帧头3A+四位数据+帧尾0D0A),发送一个事件(起名为红灯事件)。(3)在红灯线程中,有等待红灯事件的语句,没有红灯事件时,该线程进入阻塞队列,一旦有红灯事件发生,运行随后的程序,红灯状态反转。74/464.2.3事件的编程实例(1)声明事件字全局变量并创建事件字G_VAR_PREFIXevent_tg_EventWord;(3)创建事件字实例g_EventWord=event_create("g_EventWord",IPC_FLAG_PRIO);(2)确定要用的事件名称、使用事件字的哪儿一位#defineRED_LIGHT_EVENT(1<<3)2.准备阶段75/464.2.3事件的编程实例等待事件发生在线程中使用event_recv函数等待事件位被置位,根据参数选项选择“逻辑与”或“逻辑或”方式等待。设置事件位在触发事件的线程或中断服务例程中使用event_send函数对事件位置位,通知等待线程事件发生。event_recv(g_EventWord,RED_LIGHT_EVENT,EVENT_FLAG_OR|EVENT_FLAG_CLEAR,WAITING_FOREVER,&recvedstate);uart_send_string(UART_User,(void*)"在红灯线程中,收到红灯事件,红灯反转\r\n");gpio_reverse(LIGHT_RED);//反转红灯event_send(g_EventWord,RED_LIGHT_EVENT);//设置红灯事件3.应用阶段76/464.2.3事件的编程实例红灯线程代码展示了红灯线程等待事件触发后反转红灯状态的完整代码,包括线程初始化和主循环部分。用户串口中断服务例程代码展示了串口接收完整数据帧后发送事件的中断服务例程代码,实现中断与线程的通信。4.样例程序源码77/464.2.3事件的编程实例5.运行结果78/46消息队列4.3PART-实时操作系统应用开发技术消息队列是RTOS中用于线程间或线程与中断间传送数据的同步与通信手段。它是一种容器,用于保存消息,实现线程间的同步和大量数据交换。消息队列允许消息发送方在队列未满时发送消息,接收方在队列非空时取出消息。消息队列具有缓冲功能,可解决消息堆积问题。适用于消息产生周期短、处理周期长,或消息产生随机、处理速度与内容有关的情况。这两种情况均可把产生与处理分在两个程序主体进行编程,它们之间通过消息队列通信。例如,消息的产生是随机的,某些消息的处理时间可能较长,通过消息队列可以实现消息的缓冲和同步传递。0102消息队列的含义消息队列的应用场合4.3.1消息队列的含义及应用场合80/461.创建消息队列变量函数mq_create在使用消息队列之前必须调用创建消息队列变量函数创建一个消息队列结构体指针变量,并分配内存空间。函数功能为创建一个消息队列结构体指针变量,参数包括消息队列名称、消息大小(单位为字节)、消息队列中最多能容纳的消息数以及消息队列标志位。消息队列标志位可选择IPC_FLAG_PRIO(优先级高的线程优先)或IPC_FLAG_FIFO(先进先出顺序)。4.3.2消息队列的常用函数81/462.发送消息函数mq_send将消息放入消息队列,若消息阻塞队列中有等待消息的线程,RTOS内核将其移出放入就绪队列。参数包括消息队列控制块、消息内容和消息的大小,函数返回成功或错误代码。4.3.2消息队列的常用函数82/463.获取消息函数mq_recv运行到此函数,若消息队列为空,则线程阻塞,直到消息队列中有消息,阻塞解除,运行其后代码。参数包括消息队列控制块、接收消息的地址、接收缓冲区的大小以及等待的超时时间,函数返回状态代码值。4.3.2消息队列的常用函数//==================================================================//函数名称:mq_send//功能概要:发送消息(即将消息放入消息队列)//参数说明:mq-消息队列控制块//buffer-消息内容//size-消息的大小(即一条消息的字节数)//函数返回:返回成功或错误代码//==================================================================err_tmq_send(mq_tmq,void*buffer,size_tsize);

41//timeout-设置等待的超时时间,一般为WAITING_FOREVER:永久等待//功能概要:将消息从消息队列中取出//==================================================================err_tmq_recv(mq_tmq,void*buffer,size_tsize,int32_ttimeout)83/461.消息队列样例程序的功能(1)用户串口中断为收到一个字节产生中断,在“isr.c”文件的中断服务例程UART_User_Handler中,进行接收组帧。(2)当串口接收到一个完整的数据帧(帧头3A+8字节数据+帧尾0D0A),发送一个消息,每个消息就是数据帧中的8字节数据。注意每个消息的字节数是在创建消息队列时确定的,且为定长。(3)在等待消息的线程(thread_message_recv)中,有等待消息的语句,若消息队列中没有消息,该线程进入消息阻塞队列,一旦消息队列中有消息,运行随后的程序,通过串口(波特率为115200)打印出消息,以及消息队列中剩余消息的个数。4.3.3消息队列的编程实例84/462.准备阶段(1)声明消息队列变量。在使用消息队列之前,首先在07_AppPrg文件夹下的工程总头文件(includes.h文件)中声明一个全局消息队列变量g_mq。G_VAR_PREFIXmq_tg_mq;//声明一个全局消息变量111111111111111111111(2)创建消息队列实例。在threadauto_appinit.c文件的thread_auto函数中创建消息队列实例,实参为:消息变量名字为g_mq,每个消息8个字节,最大消息个数4个。//创建消息队列,参数为:名字、单个消息字节数、消息个数、进出方式(先进先出)g_mq=mq_create("g_mq",8,4,IPC_FLAG_FIFO);111111111111111111111111111111111114.3.3消息队列的编程实例85/46(1)等待消息。即通过mq_recv函数获取消息队列中存放的消息。例如在本节样例程序中,thread_messagerecv.c文件中,有如下语句,该语句之后的程序,等待消息队列中有消息时才会被运行。(2)发送消息(将消息放入消息队列)。通过mq_send函数将消息放入消息队列中,若消息队列中存放的消息数已满,则会直接舍弃该条消息。例如在本节样例程序的中断服务例程UART_User_Handler中,将收到的消息放入消息队列。3.应用阶段4.3.3消息队列的编程实例86/464.样例程序源码4.3.3消息队列的编程实例1等待消息的线程代码展示了等待消息的线程代码,包括线程初始化和主循环部分,详细说明了消息接收和处理过程。2用户串口中断服务例程代码展示了用户串口中断服务例程代码,详细说明了如何接收完整数据帧并发送消息。87/465.运行结果4.3.3消息队列的编程实例88/46信号量4.4PART-实时操作系统应用开发技术信号量是一个非负整型变量,用于确保线程在访问共享资源时不会发生冲突。利用信号量机制访问共享资源时,线程必须获取对应的信号量。如果信号量不为0,则表示还有资源可以使用,线程可使用该资源,并将信号量减1;如果信号量为0,则表示资源已被用完,线程进入信号量阻塞列表,排队等候其他线程使用完资源后释放信号量。信号量的最大值为1时,信号量就变成了互斥量。1.信号量的含义用于实现线程之间的有序操作、互斥执行以及控制线程的并发数等。例如,在停车场车位管理中,信号量初始值为停车场可用车辆数量,车辆进入停车场前先申请信号量,若信号量大于0,车辆可以进入并占用一个车位,信号量减1;若信号量为0,车辆进入阻塞状态等待。当有车辆离开停车场时,信号量加1,等待的车辆可以进入。这种有序的特性使信号量在计算机中有较多的应用场合。2.信号量的应用场合4.4.1信号量的含义及应用场合90/461.创建信号量变量函数sem_create在使用信号量之前必须调用创建信号量变量函数创建一个信号量结构体指针变量,并设置可用资源的最大数。4.4.2信号量的常用函数91/462.等待获取信号量函数sem_take在获取共享资源之前,需要等待获取信号量。若可用信号量个数大于0,则获取一个信号量,并将可用信号量个数减1;若可用信号量个数为0,则阻塞线程,直到其他线程释放信号量。4.4.2信号量的常用函数92/463.释放信号量函数sem_release当线程使用完共享资源后,需要释放占用的共享资源,使可用信号量值加1。4.4.2信号量的常用函数93/46以三辆车进只有两个停车位的停车场为例,通过信号量实现车辆的有序进场停车。该工程模拟的功能是:车辆1、车辆2和车辆3分别停随机的3-13秒,通过信号量来管理停车场的空车位,实现车辆的有序进场和出场。1.信号量样例程序的功能4.4.3信号量的编程实例94/46通过sem_create函数初始化信号量结构体指针变量,设置最大可用资源数。例如在本节样例程序中,在thread_auto中初始化信号量结构体指针变量,为了模拟演示设置最大可用停车位为2。2.准备阶段4.4.3信号量的编程实例95/46(1)等待信号量。在线程访问资源前,通过sem_take函数等待信号量;若无可用信号量时,则线程进入信号量阻塞列表,等待可用信号量的到来。例如在本节样例程序中,在对应线程中获取信号量,代码如下:sem_take(g_sp,WAITING_FOREVER);//等待信号量1111111111(2)释放信号量。在线程使用完资源后,通过sem_release函数释放信号量。例如在本节样例程序中,在对应线程中释放信号量,代码如下:sem_release(g_sp);//释放信号量111111111111111111111111111111

3.应用阶段4.4.3信号量的编程实例96/464.4.3信号量的编程实例展示了停车线程的完整代码,包括线程初始化和主循环部分,详细说明了信号量的获取和释放过程。4.样例程序源码4.样例程序源码97/464.4.3信号量的编程实例5.运行结果98/46互斥量4.5PART-实时操作系统应用开发技术STEP.01STEP.02STEP.03互斥量的概念互斥量是一种用于保护操作系统中的临界区或共享资源的同步工具,能够保证任何时刻只有一个线程能够操作临界区。互斥量的操作只有加锁和解锁两种,每个线程都可以对一个互斥量进行加锁和解锁操作,必须按照先加锁后解锁的顺序进行。一旦某个线程对互斥量加锁,在它对互斥量进行解锁操作之前,任何线程都无法再对该互斥量进行加锁,是一种独占资源的行为。互斥关系多个需求者为了争夺某个共用资源而产生的关系,竞争者之间可能彼此不认识,但为了竞争共用资源,产生了互斥关系。例如,食堂里几个人排队打饭,竞争者之间为了争夺共用资源(如打饭窗口)而产生互斥关系,没有竞争到资源的需求者都需要排队等待第一个需求者使用完资源后,才能开始使用资源。互斥应用场合在一个计算机系统中,有很多受限的资源,如串行通信接口、读卡器和打印机等硬件资源以及公用全局变量、队列和数据等软件资源需要互斥使用。4.5.1互斥量的含义及应用场合100/46创建互斥量变量函数mutex_create在使用互斥量之前必须调用创建互斥量变量函数创建一个互斥量结构体指针变量。014.5.2互斥量的常用函数101/46获取互斥量函数mutex_take调用获取互斥量函数将在指定的等待时间内获取指定的互斥量。024.5.2互斥量的常用函数102/46互斥量释放函数mutex_release调用互斥量释放函数将释放指定的互斥量。034.5.2互斥量的常用函数103/46通过互斥量实现线程对资源的独占访问,使红灯、绿灯、蓝灯线程按照一定时间间隔单独亮,不出现混合颜色。该工程实现的功能是:红灯线程每5秒闪烁一次、绿灯线程每10秒闪烁一次、蓝灯线程每20秒闪烁一次。通过单色灯互斥量使得每一时刻只有一个灯亮,不出现混合颜色情况。1.样例程序的功能4.5.3互斥量的编程实例104/46(1)在includes.h中定义互斥量。G_VAR_PREFIXmutex_tg_mutex;111111111111111111111111111111111111111111111111111111111111111111

(2)在thread_auto函数中初始化互斥量。g_mutex=mutex_create("g_mutex",IPC_FLAG_PRIO);//初始化互斥量变量11111111111111111111111111112.准备阶段4.5.3互斥量的编程实例105/46(1)锁定互斥量。在线程访问独占资源前,通过mutex_take函数锁定互斥量,以获取共享资源使用权;若此时独占资源已被其他线程锁定,则线程进入互斥量的阻塞列表中,等待锁定此独占资源的线程解锁该互斥量。mutex_take(g_mutex,WAITING_FOREVER);11111111111111111111111111111111111111111111111111111111111111111

(2)解锁互斥量。在线程使用完独占资源后,通过mutex_release()函数解锁互斥量,释放对独占资源的使用权,以便其他线程能够使用独占资源。mutex_release(mutex);111111111111111111111111111111111111111111111111111111111111111111111111111111114.应用阶段4.5.3互斥量的编程实例106/46展示了红灯线程的完整代码,包括线程初始化和主循环部分,详细说明了互斥量的锁定和解锁过程。4.样例程序源码与运行过程分析4.5.3互斥量的编程实例107/465.运行结果4.5.3互斥量的编程实例108/46谢谢大家主讲人:王宜怀时间:2025.6实时操作系统应用开发技术第5章底层驱动构件主讲人:王宜怀时间:2025.6实时操作系统应用开发技术CONTENT目录嵌入式构件概述底层驱动构件的设计原则与方法底层驱动构件设计与测试举例算法构件设计实例本章小结外部设备构件设计实例5.15.35.55.25.45.6嵌入式构件概述5.1PART-实时操作系统应用开发技术构件是软件复用的基础,传统产业通过标准化构件提高效率,软件产业借鉴此模式,构件标准化是软件复用与移植的重要前提。传统产业借鉴嵌入式系统硬件和软件设计复杂性增加,开发由个人转向团队,构件设计与应用成为提高软硬件设计可重用性与可移植性的基础与保障。嵌入式系统发展5.1.1制作构件的必要性113/43构件定义软件构件定义多样,但通常可理解为具有可复用价值的单位软件,是软件复用过程中可以明确辨别的成分,从程序角度看是有一定功能的程序体。构件的语义与语法构件在语义完整、语法正确的情况下,具有可复用价值,能够独立工作或与其他构件协同完成任务。5.1.2构件的基本概念114/43底层驱动构件直接干预硬件,如GPIO、UART等,面向芯片,不考虑具体应用,以功能模块独立性为准则进行封装。底层驱动构件01外部设备构件通过调用底层驱动构件完成,如LCD构件,面向实际MCU外围硬件模块,以硬件模块独立性为准则进行封装。外部设备构件02算法构件与硬件无关,如排序算法等,面向实际算法,以功能独立性为准则进行封装。算法构件035.1.3嵌入式开发中的构件分类115/43构件的表现形式构件的基本特征0102封装性、描述性、可移植性与可复用性是软件构件的基本特性,封装内部实现细节,提供规范接口,便于移植和复用。构件由头文件和源程序文件组成,对外接口函数命名规范,内部函数不暴露,与RTOS无关,便于应用和移植。5.1.4构件的基本特征与表现形式116/43底层驱动构件的设计原则与方法5.2PART-

实时操作系统应用开发技术底层驱动构件位于应用系统最底层,设计时需分层组织构件,上层构件可调用下层服务,同层构件不相互依赖。1.层次化原则在函数内部检测输入参数,处理异常情况,确保程序运行安全,避免出现异常状况。3.鲁棒性原则函数名简洁达意,接口参数清晰,使用说明规范,避免代码量过多,提高易用性。2.易用性原则优先使用静态分配内存,谨慎使用变量,防止“野指针”和缓冲区溢出,保证系统稳定运行。4.内存可靠原则5.2.1底层驱动构件设计的基本原则118/43该构件由gpio.h和gpio.c文件组成,使用时将其加入工程即可简化GPIO编程。经分析,GPIO构件通常包含若干函数,用于满足输入输出等不同场景的操作需求。1.模块初始化函数:voidgpio_init(uint16_tport_pin,uint8_tdir,uint8_tstate)2.设置引脚状态函数:voidgpio_set(uint16_tport_pin,uint8_tstate)3.获得引脚状态函数:uint8_tgpio_get(uint16_tport_pin)4.引脚状态反转函数:voidgpio_reverse(uint16_tport_pin)5.引脚上下拉使能函数:voidgpio_pull(uint16_tport_pin,uint8_tpullselect)GPIO构件设计5.2.2底层驱动构件设计要点分析119/43011.底层驱动构件的组成、存放位置与内容每个构件由头文件和源文件组成,放在以构件名命名的文件夹中,头文件仅包含对外接口函数声明。022.设计构件的最基本要求考虑使用与移植方便,统一编码风格与注释,限制宏的使用,禁止使用全局变量。5.2.3底层驱动构件封装规范概要120/43位操作宏函数定义位操作宏函数,如置位、清位、获得某一位状态等,方便寄存器操作。01不优化类型的简短别名给不优化类型定义简短别名,如vuint8_t等,方便嵌入式程序编写。025.2.4封装的前期准备:公共要素121/43底层驱动构件设计与测试举例5.3PART-

实时操作系统应用开发技术1.GPIO知识要素5.3.1GPIO构件GPIO含义与作用GPIO是通用输入输出接口,用于控制和读取引脚状态。作为输入可获取外部信号,作为输出可控制外部设备,是嵌入式系统与外部交互的基本方式。输出引脚外部电路接法输出引脚可直接驱动小电流设备,如通过GPIO引脚控制LED灯的亮灭,或通过三极管驱动蜂鸣器发声,实现简单的外部设备控制。输入引脚外部电路接法输入引脚需合理接法以保证信号稳定,如使用上拉或下拉电阻避免信号悬空,确保输入信号的准确采样。123/432.GPIO构件API5.3.1GPIO构件124/433.GPIO构件的输出测试方法5.3.1GPIO构件1.给灯命名:在05_UserBoard\user.h文件中用宏定义蓝灯对应的GPIO引脚(如#defineLIGHT_BLUE(PTB_NUM|9)),避免在主程序中直接使用引脚号,保证工程可移植性。2.定义灯状态:在user.h中根据硬件电路定义灯的亮暗状态(如LIGHT_ON=0、LIGHT_OFF=1),便于后续编程适配硬件,若电路变更只需修改宏定义。3.初始化蓝灯:在07-AppPrg\main.c的用户外设初始化处,调用gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_OFF),将蓝灯初始化为输出模式,初始状态为暗。4.切换灯状态:在main函数主循环中,通过状态标志mFlag控制蓝灯闪烁。当mFlag='L'时,灯亮并计数;当mFlag='A'时,灯暗,使用gpio_set函数切换状态并通过printf输出调试信息。5.程序运行与调试:编译生成hex文件后下载到开发板,蓝灯每秒闪烁一次,同时串口显示灯状态变化信息,可通过printf语句直观调试程序125/43串行通信的基本概念与编程模型015.3.2UART构件异步串行通信采用NRZ数据格式,通过起始位、数据位和停止位传输数据,是嵌入式系统常用的通信方式。异步串行通信格式波特率表示每秒传输的位数,常用的波特率有9600、115200等,波特率的选择影响通信速度和可靠性。串行通信的波特率串行通信有单工、半双工和全双工三种传输方式,全双工通信效率最高,可同时收发数据。串行通信传输方式126/43串行通信的硬件信号变换025.3.2UART构件RS485采用差分信号负逻辑,-2V~-6V表示“1”,+2V~+6V表示“0”,通信距离在1000米左右,可较好地抑制电磁干扰,但二线的RS485通信只能工作于半双工方式。RS48502RS232采用负逻辑,-15V~-3V为逻辑“1”,+3V~+15V为逻辑“0”,最大传输距离30m,通信速率一般低于20kbps。RS23201TTL-USB串口芯片可将TTL电平转换为USB信号,方便与电脑通信。AHL-CH32V303-WiFi

开发板使用的是CH342芯片,通过

Typc-C连接电脑后可在设备管理器中看到串口提示。TTL-USB串口03127/433.UART构件API5.3.2UART构件128/434.中断编程步骤—以串口接收中断为例5.3.2UART构件129/431.Flash在线编程的通用基础知识5.3.3Flash构件Flash编程基本操作Flash编程的基本操作包括擦除和写入,擦除操作将存储单元内容由二进制的0变成1,写入操作将某些位由二进制的1变成0。写入前需先执行擦除操作,擦除操作包括整体擦除和以扇区为单位的擦除。Flash存储器特点Flash存储器具有固有不易失性、电可擦除、可在线编程、存储密度高、功耗低和成本较低等特点,广泛应用于MCU中,用于固化程序和保存运行参数。STEP02STEP01130/432.Flash驱动构件知识要素分析5.3.3Flash构件131/433.Flash驱动构件的使用方法5.3.3Flash构件测试扇区宏定义在user.h文件中对测试的扇区号及物理地址进行宏定义,如TEST_SECT定义为1800,TEST_ADDR为对应物理地址,便于在main.c中使用,提高代码复用性。初始化Flash模块时需对要擦除的区域进行解锁,为后续擦除和写入操作做好准备。执行写入操作前,调用flash_erase函数擦除要写入的扇区,确保写入区是空白的,避免数据冲突。调用flash_write函数进行数据写入,传入扇区号、偏移量、写入数据长度和写入数组等参数,写入后可通过读取操作核对数据。操作IDE的顶部菜单“工具”→“读地址操作”,根据user.h中给出的地址说明,读出指定地址的信息,确认写入情况。0102030405初始化Flash模块擦除要写入的区域写入数据通过IDE的工具读出查看132/431.ADC的通用基础知识5.3.4ADC构件量化误差:模拟量量化过程中产生的误差,理论上为±1/2LSB,不可消除。转换速度:与转换精度、采样时间等有关,硬件类型及制造工艺影响其特征值。A/D参考电压:为A/D转换提供基准,可使用单独电源以提高精度。与A/D转换编程关联度较弱的技术指标模拟量是连续变化的物理量,可取任意值;数字量是分立量,只能取一些分立值。模数转换器(ADC)是将模拟信号转换为数字信号的电子器件,用于将连续变化的模拟量转换

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论