嵌入式系统原理及其应用
2023-05-28 20:48:29 57 举报
AI智能生成
思维导图
作者其他创作
大纲/内容
嵌入式系统概述
嵌入式系统基本概念
定义及特点
IEE定义:“控制、监视或者辅助装置、机器和设备运行的装置”
国内定义:以计算机技术为基础,以应用为中心,软件硬件可剪裁,适合应用系统对<br>功能可靠性、成本、体积、功耗严格要求的专业计算机系统。
特点:(1)技术密集(2)以应用为中心(3)软硬件可剪裁(4)高可靠高实时性
发展历程及趋势
嵌入式系统从无操作系统、简单操作系统、实时操作系统,发展到面向Internet阶段。
(1)小型化、智能化、网络化、可视化<br>(2)云计算、可重构、虚拟化等技术被进一步应用到嵌入式系统<br>(3)嵌入式软件开发平台化、标准化,系统可升级、代码可复用更受重视<br>(4)低功耗、绿色环保和信息安全性
应用
1. 消费电子 2. 工业控制 3. 医疗设备 4. 家庭智能管理系统 5. 环境工程 6. 机器人
架构
嵌入式系统硬件
应用架构
嵌入式处理器
ARM微处理器
嵌入式系统软件
软件架构
顺序执⾏的前后台架构
基于前后台的时间⽚轮询架构
多任务操作系统架构
编程思想
<span style="font-size: inherit;">分层模块化 </span><br>
只能上层调⽤下层的函数接⼝,且不能不能跨层调⽤;模块与模块之间相互独⽴;模块功能只能增加,不能更改
STM32软硬件基础
STM32概述
STM32产品系数及命名规则
STM32L431性能
STM32L431外部结构
最小系统设计
概念
设计示例
开发环境搭建
裸机
RT-Thred
通用输入输出
GPIO概念及应用场景
GPIO概念
通⽤功能输⼊输出,是相对于复⽤功能输⼊输出AFIO而言。
GPIO应用场景
监测开关信号
控制开关设备
IO内部电路结构及工作模式
内部电路结构
工作模式
上拉输⼊
下拉输⼊
浮空输⼊
模拟输⼊
推挽输出
开漏输出
复⽤推挽输出
复⽤开漏输出
GPIO示例1--状态指示灯
电路原理
实现过程
GPIO示例2--按键控制LED
电路原理
实现过程
外部中断
中断基本概念
中断:MCU执⾏主程序时,出现了某些意外或紧急事件,需要MCU紧急处理,此时主程序被打断,MCU转⽽处理紧急事件,处理完毕后再返回继续执⾏主程序的过程。中断服务程序通常为一个函数,该函数实现紧急处理功能。
STM32外部中断
EXTI主要特征
(1)可产⽣最多39和事件/中断请求,包括25个可配置中断和14个直接中断;
(2)每个事件/中断具有独⽴的屏蔽控制;
(3)可配置中断包括IO引脚中断和部分其它外设中断,⽀持上升沿或下降沿触发,并且具有专⽤的状态位⽤于指⽰中断源。
(4)直接中断主要是部分外设产⽣的唤醒事件,⽤于唤醒设备,其状态标志由相应外设提供。
(5)所有中断可通过软件进⾏模拟。
EXTI内部电路结构
EXTI应用步骤
1.引脚功能选择
2.⼯作模式详细配置
3.NVIC设置
4.中断服务程序实现
EXTI应用
按键控制LED
STM32定时器
定时器/计时器基本概念
定时器与计时器的概念和区别
定时器/计数器是MCU基本功能之一,在实际应⽤中主要⽤于精确定时和外部计数,通常简称为定时器。基于前后台的时间⽚轮询架构中的时间⽚就是由定时器产⽣的,即由一个定时器产⽣精确定时,主程序根据时间⽚选择执⾏相应的任务
本质上,定时器和计数器都是计数器,区别是计数对象不同,所对应的应⽤场景也不同,定时器可看成计数器的一种特例。由于精确定时是定时器/计数器的最基本功能,因此,⾏业内通常将定时器/计数器简称为定时器。
定时器基本问题
定时器应⽤中通常会⾯临四个基本问题,即周期、位数、计数值和中断处理。
定时器分类
STM32定时器系统
TIM内部电路
脉宽调制
脉宽调制,是一种对模拟信号电平进⾏数字编码的⽅法,可以利⽤MCU的数字输出,通过对一系列脉冲宽度进⾏调制,实现对模拟电路的控制,⼴泛应⽤于测量、通信、⼯控等领域。
TIM应用实例
精确延时
(1)创建⼯程及最⼩系统配置。
(2)定时器配置。
(3)编程实现⼯程。
PWM控制LED
(1)创建⼯程及最⼩系统配置。
(2)PWM配置。
(3)编程实现⼯程。
串口通信
通信基础
通信分类
异步串行通信
并⾏通信⽤多条数据线将数据字节中的各位同时传输。<br>效率⾼,成本⾼。有时钟线,传输信息帧(多个字符),⽤于芯⽚间通信。
STM32串口系统
USART特点
在使⽤上LPUART与UASRT没有本质区别。1.具有相互独⽴的数据接收和数据发送引脚,全双⼯通信;2.具有独⽴的⾼精度波特率发⽣器,不占⽤定时/计数器;3.⽀持5、6、7、8和9位数据位,1或2位停⽌位的字符帧结构;4.具有三个完全独⽴的中断:TX发送完成中断、TX 发送数据寄存器空中断、RX接收完成中断;5.⽀持奇偶校验;6.⽀持数据溢出检测和帧错误检测;7.⽀持同步操作,可主机时钟同步,也可从机时钟同步;8.⽀持多机通信模式。
内部电路结构
USART应用实例
串口打印
开关量远程监测
RTT基础
RTT系统架构
RTT简介
RT-Thread,全称是RealTime-Thread,是一个嵌⼊式实时多线程操作系统,基本属性之一是⽀持多任务,允许多个任务同时运⾏,但并不意味着处理器在同一时刻真地执⾏了多个任务。
系统架构
RTT开发环境搭建
下载安装
软件测试
RTT内核基础
内核简介
内核位于内核层,是操作系统最基础最重要的部分,<br>内核包括内核库和实时内核。
RTT启动流程
启动流程是了解一个系统的开始,RTT⽀持多种平台和多种编译器,⽽rtthread_startup函数是RTT规定的统一启动⼊⼝,其执⾏顺序是:系统先从启动⽂件开始运<br>⾏,然后进⼊RTT启动函数rtthread_startup,最后进⼊⽤⼾⼊⼝函数main。
程序内存分布
MCU包含FLASH和RAM两类存储空间。RT-Thread<br>Studio将程序编译后分为text、data和bss三个程序段,分别存储在MCU不同的存储区。
自动初始化机制
内核对象模型
静态内核对象
在程序中初始化,静态对象会占⽤RAM空间,不依赖于内存堆管理器,内存分配时间确定,运⾏效率⾼。
动态内核对象
动态内核对象则是从内存堆中创建的。动态对象不占⽤额外的RAM空间,依赖于内存堆管理器,运⾏时申请RAM 空间,当对象被删除后,占⽤的RAM空间被释放,运⾏效率较低。
RTT线程管理
线程基本概念
线程概念
线程是任务的实现载体,是RTT操作系统中最基本的调度单位。
线程管理方式及特点
线程管理的主要功能是对线程进⾏管理和调度,以实现不同线程的快速切换,达到多线程同时运⾏的⽬的,实际上同一时刻MCU只能运⾏一个线程。
线程调度由线程调度器完成,RT-Thread的线程调度器是抢占式的,即保证最⾼优先级的线程能够被优先运⾏,具体实现⽅式是线程调度器从就绪线程列表中查找最⾼优先级线程,最⾼优先级的线程一旦就绪,便获得CPU的使⽤权运⾏。
线程工作机制
线程控制块
线程控制块是操作系统⽤于管理线程的一个数据结构,存放了线程的优先级、线程名称、线程状态、链表结构、线程等待事件集合等信息
线程主要属性
系统线程
线程应用方法及实例
线程管理API
动态线程应用步骤
状态指示灯线程
线程间同步
信号量
概念
线程间同步是指多个线程通过特定的机制来控制多个线程的执⾏顺序
工作机制
管理方式
应用方法
(1)定义信号量句柄:rt_sem_tdynamic_sem=RT_NULL;
(2)主线程创建信号量:dynamic_sem=rt_sem_create("dsem",0,RT_IPC_FLAG_FIFO);
(3)线程1#X释放信号量:rt_sem_release(dynamic_sem);
(4)线程2#Y获取信号量:result=rt_sem_take(dynamic_sem,RT_WAITING_FOREVER);
互斥量
概念
互斥量⼜叫相互排斥的信号量,是一种特殊的⼆值信号量。
工作机制
管理方式
1.创建和删除互斥量
2.获取和释放互斥量
应用方法
(1)定义互斥量句柄:rt_mutex_tdynamic_mutex=RT_NULL;
(2)主线程创建互斥量:dynamic_mutex=rt_mutex_create("dmutex",RT_IPC_FLAG_FIFO);
(3)线程获取互斥量:rt_mutex_take(dynamic_mutex,RT_WAITING_FOREVER);
(4)持有线程释放互斥量:rt_mutex_release(dynamic_mutex);
事件集
概念
事件集主要⽤于线程间一对多,多对多的同步。有以下⼏种情况
特定事件唤醒线程
任意单个事件唤醒线程
多个事件同时发⽣才唤醒线程
工作机制
事件集⽤一个32位⽆符号整型变量表⽰,变量的每一位代表一个事件,线程通过“逻辑与”或“逻辑或”将一个或多个事件关联起来,形成事件组合。事件集控制块是操作系统⽤于管理事件的一个数据结构,由结构体<br>structrt_event表⽰。rt_event_t表⽰事件句柄,即指向事件控制块的指针。rt_event继承rt_ipc_object,由IPC容器管理。
管理方式
1.创建和删除事件集<br>rt_event_trt_event_create(constchar*name,rt_uint8_tflag);rt_err_trt_event_delete(rt_event_tevent);
2.发送事件<br>rt_err_trt_event_send(rt_event_tevent,rt_uint32_tset);
3.接收事件<br>rt_err_trt_event_recv(rt_event_tevent,rt_uint32_tset,rt_uint8_toption,rt_int32_ttimeout,rt_uint32_t*recved);
应用方法
(1)定义事件:#defineEVENT_FLAG3(1<<3)#defineEVENT_FLAG5(1<<5)
(2)定义事件句柄:rt_event_tdynamic_event=RT_NULL;
(3)主线程创建事件集:dynamic_event=rt_event_create("devent",RT_IPC_FLAG_FIFO);
(4)线程1#X发送事件:rt_event_send(dynamic_event,EVENT_FLAG3);
(5)线程2#Y接收事件:rt_uint32_te;if(rt_event_recv(dynamic_event,<br>(EVENT_FLAG3|EVENT_FLAG5),RT_EVENT_FLAG_OR|<br>RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER,&e)==RT_EOK){//执⾏操作}
应用实例
线程间通信
邮箱
概念
邮箱是一种线程间通信⽅法,开销较低,效率较⾼,邮箱中的每一封邮件只能容纳固定的4字节内容(针对32位处理系统,指针的⼤⼩即为4个字节,一封邮件恰好能容纳一个指针)。
工作机制
邮箱控制块是操作系统⽤于管理邮箱的一个数据结构,由结构体structrt_mailbox表⽰。rt_mailbox_t表⽰邮箱句柄,即指向邮箱控制块的指针。rt_mailbox继承<br>rt_ipc_object,由IPC容器管理,邮箱容量的最⼤值是65535。
管理方式
1.创建和删除邮箱<br>rt_mailbox_trt_mb_create(constchar*name,rt_size_tsize,rt_uint8_tflag);rt_err_trt_mb_delete(rt_mailbox_tmb);
2.发送邮件<br>rt_err_trt_mb_send(rt_mailbox_tmb,rt_uint32_tvalue);<br>rt_err_trt_mb_send_wait(rt_mailbox_tmb,rt_uint32_tvalue,rt_int32_ttimeout);
3.接收邮件<br>rt_err_trt_mb_recv(rt_mailbox_tmb,rt_uint32_t*value,rt_int32_ttimeout);
应用方法
(1)定义邮箱句柄:rt_sem_tdynamic_mb=RT_NULL;
(2)主线程创建邮箱:dynamic_mb=rt_mb_create("dmb",32,RT_IPC_FLAG_FIFO);
(3)线程1#X发送邮件:charmb_str1[]="I'mamail!";rt_mb_send(dynamic_mb,(rt_uint32_t)&mb_str1);<br>
(4)线程2#Y接收邮件:char*str;rt_mb_recv(dynamic_mb,(rt_uint32_t*)&str,<br>RT_WAITING_FOREVER)
消息队列
概念
消息队列是邮箱的扩展,能够接收来⾃线程或中断服务例程中不固定⻓度的消息,并把消息缓存在⾃⼰的内存空间中。其他线程也能够从消息队列中读取相应的消息,⽽当消息队列是空的时候,可以挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒以接收并处理消息。
工作机制
管理方式
1.创建和删除互斥量<br>rt_mq_trt_mq_create(constchar*name,rt_size_tmsg_size,rt_size_tmax_msgs,rt_uint8_tflag);rt_err_trt_mq_delete(rt_mq_tmq);
2.发送消息<br>rt_err_trt_mq_send(rt_mq_tmq,void*buffer,rt_size_tsize);<br>rt_err_trt_mq_send_wait(rt_mq_tmq,constvoid*buffer,rt_size_tsize,rt_int32_ttimeout);rt_err_trt_mq_urgent(rt_mq_tmq,void*buffer,rt_size_tsize);
3.接收消息<br>rt_err_trt_mq_recv(rt_mq_tmq,void*buffer,rt_size_tsize,rt_int32_ttimeout);
应用方法
(1)定义消息队列句柄:rt_mq_tdynamic_mq=RT_NULL;
(2)主线程创建消息队列:dynamic_mq=rt_mq_create("dmq",1024,50,RT_IPC_FLAG_FIFO);
(3)线程1#X发送消息:charbuf='A';rt_mq_send(dynamic_mq,&buf,1);
(4)线程2#Y接收消息:charbuf=0;rt_mq_recv(dynamic_mq,&buf,sizeof(buf),RT_WAITING_FOREVER);
信号
概念
信号(⼜称为软中断信号),在软件层次上是对中断机制的一种模拟,⽤来通知线程发⽣了异步事件,⽤做线程之间的异常通知、应急处理。在原理上,一个线程收到一个信号与处理器收到一个中断请求可以说是类似的。<br>信号本质是软中断,线程不必通过任何操作来等待信号的到达,事实上,线程也不知道信号到底什么时候到<br>达,线程之间可以互相通过调⽤rt_thread_kill()发送软中断信号。
工作机制
线程处理信号的⽅式:<br>第一种:类似中断,指定处理函数,由该函数来处理。第⼆种,忽略某个信号。<br>第三种:对该信号的处理保留系统的默认值。
管理方式
1.安装信号<br>rt_sighandler_trt_signal_install(intsigno,rt_sighandler_t[]handler);
2.阻塞和解除阻塞信号<br>voidrt_signal_mask(intsigno);<br>voidrt_signal_unmask(intsigno);
3.发送信号<br>intrt_thread_kill(rt_thread_ttid,intsig);
4.发送信号<br>intrt_thread_kill(rt_thread_ttid,intsig);
应用方法
(1)线程tid1安装信号,并解除阻塞:<br>rt_signal_install(SIGUSR1,thread1_signal_handler);rt_signal_unmask(SIGUSR1);
(2)线程tid2发送信号rt_thread_kill(tid1,SIGUSR1);
(3)编写信号处理函数:void<br>thread1_signal_handler(intsig){rt_kprintf("thread1 receivedsignal%d\n",sig);}
应用实例
设备管理
设备驱动框架
IO设备模型
IO设备模型框架
1.设备驱动层是一组驱使硬件设备⼯作的程序,将IO设备注册到设备驱动框架层或IO设备管理层(简单设备)实现硬件设备功能的⾸次封装。
2.设备驱动框架层对同类硬件设备驱动的再次抽象,提<br>取不同⼚家同类硬件设备驱动中相同部分,不同部分留出接⼝,由设备驱动层实现。
3.IO设备管理层对设备驱动程序进⾏第三次封装,提供了标准接⼝供应⽤程序调⽤以访问底层设备。
4.硬件操作与应⽤程序相互独⽴,降低了代码的耦合性、复杂性,提⾼了系统的可靠性。
IO设备访问
经过IO设备模型框架对设备驱动的三次封装,应⽤程序可通过标准的IO设备管理接⼝实现硬件设备的访问。
PIN设备
引脚编号
PIN设备即GPIO,为了⽅便管理,PIN设备驱动<br>(drv_gpio.c)中定义了引脚索引,⼜称为引脚编号。
管理方式
/*1.包含投⽂件*/#include<board.h>#include<rtdevice.h>/*<br>2.获取引脚编号*/#defineLED1GET_PIN(A,0)//LED1引脚编号#defineK1GET_PIN(B,12)//按键K1引脚编号/*<br>3.设置引脚模式*/rt_pin_mode(LED1,PIN_MODE_OUTPUT);//LED1推挽输出rt_pin_mode(K1,<br>PIN_MODE_INPUT_PULLDOWN)//K1下拉输⼊/*<br>4.绑定K1中断回调函数,上升沿触发中断*/rt_pin_attach_irq(K1,PIN_IRQ_MODE_RISING,irq_k1,<br>RT_NULL);/*<br>5.使能引脚中断*/rt_pin_irq_enable(K1,PIN_IRQ_ENABLE);/*<br>6.编写中断回调函数*/voidirq_k1(void*args){/*改变LED1状态*/rt_pin_write(LED1,1-rt_pin_read(LED1));}
应用步骤
应用实例
收藏
0 条评论
下一页