- 博客(34)
- 收藏
- 关注
原创 数字信号与电路的基本概念
图1 周期与非周期数字信号图2 非理想数字波形对于非理想数字波形(矩形脉冲),常用以下指标来定量描述其特性::周期性重复的脉冲序列中,两个相邻脉冲间的时间间隔,频率f=1/T表示单位时间内脉冲重复的次数;:脉冲电压的最大变化幅度;:从脉冲前沿上升到0.5Um处开始,到脉冲后沿下降到为止的一段时间;:脉冲前沿从上升到所需要的时间。:脉冲后沿从下降到所需要的时间。数字信号上升时间和下降时间的典型值约为几,视不同类型的器件和电路而异。——脉冲宽度tw占整个脉冲周期T的百分数,称为。
2025-03-23 02:10:15
395
原创 SPI总结
SPI全称Serial Peripheral Interface,串行外设接口,是一种用于连接外设的全双工通信总线。主机和从机支持一对一或一对多通讯连接。图1 SPI物理层通讯连接表1 Signal description。
2024-09-28 01:44:25
937
原创 OSEK定时器(Alarms)
对于反复出现的事件的处理,例如周期事件,或处理在特定时间点触发的事件,需要OS提供一种定时机制。对此,OSEK提供了一个两阶段的概念来实现,周期性事件被同步注册到一个计数器(),在此基础上OS向应用提供定时器机制(
2024-05-19 22:15:56
1491
原创 OSEK资源管理
资源被占用时,不可调用一些系统接口(如TerminateTask,ChainTask, Schedule,WaitEvent等)的限制,并不适用于内部资源,毕竟内部资源就是在这些系统接口调用中处理的。然而,所有的标准资源都必须在内部资源别释放之前被释放,谁第一个来,谁最后一个走。
2024-05-19 02:56:28
653
原创 OSEK事件机制(Event mechanism)
事件(event)作为OSEK的OS对象,主要用于拓展任务的同步,即使得拓展任务进入或离开等待状态(waiting state)。更直白来说,事件可以用于唤醒等待状态的任务,使之进入就绪态,或者使得当前任务进入等待状态。显然,前者可以通过系统接口来实现,而后者则是通过来实现。
2024-05-18 14:36:44
1048
原创 OSEK中断管理
如图1所示,OSEK将中断服务函数(Interrupt Service Routine,ISR)分为两类:① 一类中断服务函数(ISR category 1)该类ISR不会使用OS提供的系统服务(不包括那些中断使能除能的相关接口,毕竟OS只是封了层皮,本质上还是调用MCU提供的指令接口,一般是通过修改一些中断屏蔽寄存器来实现),中断处理完成后会返回程序被打断的指令处执行。显然,一类中断与任务管理无关,与OS井水不犯河水,开销也比较小。换句话说,一类终端完全生活在OS层以下,OS完全感知不到它的存在。
2024-05-18 00:41:52
1288
原创 OSEK应用模式
很多ECU都会执行完全独立的应用(applications),包括工厂测试(factory test),固件刷写(flash programming)或正常工作操作(normal operation)。显然,可以将应用模式看成满足特定场景的软件模式,以其对应的应用实现来组织代码,使得各场景应用之间的开发解耦。通常来说,不同应用模式都会使用自己的一套系统资源,包括taskISRsalarms及定时器。当然,如果应用模式之间存在功能上的交集,共享这些系统资源也是允许的。
2024-05-14 15:32:56
640
原创 OSEK任务管理
RTOS通过任务(task)来组织应用层程序框架(framework),并支持任务的并发和同步执行(concurrent and asynchronous execution of tasks),并通过调度器(scheduler)来管理任务的执行,OSEK也概莫能外。OSEK将任务划分为基础任务(basic tasks)和拓展任务(extended tasks)两类。对于基础任务来说,它们会一直占有CPU,直至其主动终止(terminate)任务运行,或被高优先级的任务/中断抢占,才会释放CPU资源;
2024-05-06 22:39:37
1077
原创 OSEK的设计哲学与架构
OSEK是为单核分布式嵌入式控制单元量身定制的实时系统,对事件驱动(event driven)的硬实时控制系统具有良好的适配性。OSEK没有强求不同软件模块间的完全兼容性,而是将重心放到了软件的可移植性上来。
2024-05-05 00:14:08
1302
1
原创 Quad SPI的DLP优化原理
随着嵌入式应用程序性能要求的不断提高,传统的SPl接口和协议已无法满足读取速度进一步提高的需求。DLP方法的出现,使得基于Quad SPI的Flash可以实现更高的数据速率。这一增强型的解决方案,在合理的成本控制前提下,极大程度地提高了数据读取速率,同时最大限度地减少了引脚数、PCB复杂性、封装尺寸和成本,极大地改善了系统设计和性能。
2024-05-03 15:57:59
1048
原创 深入理解Cortex-M7 SVC和PendSV
将PendSV优先级还有一点考虑,如果其优先级比较高,有可能出现以下情况:PendSV会抢断其他中断的执行,随后进行上下文切换,而其他中断以尾链机制继续执行,并请求进行上下文切换,这就导致多次重复的上下文切换,而在此过程中,无辜的任务只能眼巴巴的等着,啥都做不了,而内核在忙着来回切换上下文,浪费了很多CPU时间。此外,SVC指令要求SVC异常的优先级高于异常可执行优先级,否则将触发错误异常。因此,在NMl或HardFault等优先级高于SVC的异常处理程序中,不能使用SVC。
2024-04-14 20:25:27
1762
原创 Armv7-M Interworking机制
由于历史原因(从ARM7TDMI开始), ARM处理器一直支持两种形式上相对独立的指令集, 它们分别是: 32位的指令集,对应处理器状态:ARM状态,在32位存储器上效率较高,能够同时访问32位的数据和地址空间,具有更好的代码效率和执行速度; 16位的指令集,对应处理器状态:Thumb状态,指令长度短,代码密度高(),在16位存储器(数据总线为16位的存储系统)上效率较高,内存占用小,有利于,所以常用于嵌入式系统中对和的场景。
2024-04-10 23:35:07
1224
原创 Cortex-M7 私有外设(peripherals)总览
由Cortex-M7的内存映射模型可知,0xE000_0000~0xE00F_FFFF地址空间为私有外设总线 (Private peripheral bus,PPB)的内存区域,其具体的地址映射如表1所示。表1 PPB寄存器内存映射其中,注释后缀的相关含义如下:a,表示该外设是可选的;b ,软件可以通过读MPU Type Register(位于地址0xE000ED90),以确认是否配有MPU;此外,PPB的内存区域为不可执行的。
2024-04-07 02:04:43
807
原创 Cortex-M7 内存映射模型
软件程序直观地定义了一个程序执行流(program flow),其规则时基于一定的逻辑顺序。而当软件程序经编译器翻译成可执行的机器码并在CPU上执行时,内存系统通常不会严格按照软件程序定义的时序来进行内存访问,这也就是前文描述的乱序执行。CPU采用乱序执行的原因主要有以下几点:① 在不改变软件程序定义的指令序列的预期行为的前提下,CPU可能会对一些访存操作重新排序;② CPU拥有多个总线接口(bus interface);③ 不同的内存区域或设备具有不同的等待状态;
2024-04-06 20:55:34
1631
1
原创 Cortex-M7 异常处理与返回
当CM3开始响应一个中断时,会在它小小的体内奔涌起三股暗流: 入栈: 把8个寄存器的值压入栈; 取向量:从向量表中找出对应的服务程序入口地址; 选择堆栈指针MSP/PSP,更新堆栈指针SP,更新LR,更新程序计数器PC;---引自《Cortex-M3权威指南》为了提高异常响应的实时性,Cortex-M7采用了如下机制:①即便CPU当前正在进行异常处理,当新到异常的优先级较高时,即可进行抢占,转而处理该优先级较高的异常,即支持中断嵌套处理;②。
2024-04-05 19:28:41
1655
1
原创 Cortex-M7 中断优先级
除了Reset(优先级-3),NMI(优先级-2) 和 HardFault(优先级-1)三个异常的有限制为固定值外,对于其他优先级可配置的异常,Cortex-M7最大支持0~255共计256个优先级。具体支持的优先级范围,决定于芯片厂商的实现,通常都会进行裁剪。总的来说,Cortex-M7对于异常的优先级有着如下规定:① 优先级值越小,表示的优先级越高;② 除了Reset,NMI和HardFault外,其他异常的优先级均是可配置的;
2024-04-05 00:41:29
1944
1
原创 AUTOSAR-OS上层需求总结
在很多应用程序中,静态定义彼此相关的一组任务的触发(activation)很有必要。这有利于保证数据流的一致性,保证时序上的同步,以及准确的运行相位等。说直白点,就是希望可以有一种机制,可以按严格的时序来触发每个任务的运行,显然可以用一个时间相关事件来实现这个效果。其最终产物,就是静态任务调度表。
2024-03-31 23:36:27
1513
1
原创 Cortex-M7中断向量表的重定向
系统上电后,PC会指向复位向量,即向量表中的Reset_Handler,而系统就是通过Vector Table Offset Register (VTOR)的值加上4字节来找到复位向量的入口的。因为地址 0 处应该存储引导代码,所以它通常映射到 Flash 或者是 ROM 器件,并且它们的值不得在运行时改变。然而,为了支持动态重分发中断, CM3 允许向量表重定位——从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,但更多是在 RAM 区。在 RAM 区就可以修改向量的入口地址了。
2024-03-30 17:11:15
2480
1
原创 Cortex-M7 中断开关指令总结
PRIMASK, FAULTMASK 以及 BASEPRI是三个可以用于异常使能或除能的特殊功能寄存器,需要通过通过 MRS/MSR 指令来访问。亦或者,可以使用CPS指令来设置PRIMASK和PRIMASK这两个寄存器。
2024-03-28 00:15:42
1823
1
原创 Cortex-M7 异常(中断)基础总结
Cortex-M7集成了嵌套向量中断控制器(Nested Vectored Interrupt Controller),最大支持256个中断优先级,其 “向量” 指示着中断服务函数(interrupt service routines, ISRs)响应的方式不再通过软件编程来实现,即由硬件堆叠的寄存器组和相应可挂起的多指令加载和存储指令(可被中断打断,给中断让路),来实现从中断响应到ISR入口的快速选择这一过程。
2024-03-26 23:27:49
2298
原创 Cortex-M7 处理器模式与程序执行权限级别
图1 Cortex-M7模块总览如图1所示, Cortex-M7属于ARM V7架构,采用了6级流水线的哈弗结构和Thumb-2指令集(代码密集度code density更高,有利于减少程序代码所占用的内存空间)。其中,Cortex-M7处理器的核心外设包括以下几个部分:①,包含一个不可屏蔽中断(non-maskable interrupt, NMI),最大支持256个中断优先级,其。
2024-03-24 20:43:24
2252
1
原创 freeRTOS动态内存heap4源码分析
回过头来看:①heap_4的内存是完全是建立在一片线性连续的内存上的,heapMINIMUM_BLOCK_SIZE的定义可以抑制过度的内存碎片化;②而在申请和释放内存时,必然要有查询空闲块链表的操作,其所谓的不确定性也主要存在这里,即链表的查询时间;③另外,除了链表的首个元素xStart外,其余链表元素(内存块头)都是占用内存池的空间,这也在一定程度上导致了可分配内存的缩水;④如果需要且允许使用动态内存,heap_4支持指定内存池的起始地址,需要注意内存池是否与其他内存空间隔离开,防止内存踩踏。
2024-03-23 22:25:32
1327
原创 ARM-v7 程序计数器PC的相关指令与应用
如图1所示,R14是连接寄存器(Link Register),在汇编指令中通常也写为LR,用于存储函数调用和异常等的返回信息,复位时,默认值为0xFFFFFFFF;图1 Core registerR15是程序计数器(PC,Program Counter),,其bit[0的值为必须1,并会加载到EPSR(Execution Program Status Register)的T字段(Thumb state bit),表示处于Thumb状态。
2024-03-09 23:42:45
1380
1
原创 ARM-v7 数据大小端转换实现
如果当前的CPU是ARM的Cortex-M架构微控制器,建议使用标准的CMSIS接口来进行大小端转换,不仅效率高,软件移植性也会更好。
2024-03-03 23:48:58
1935
原创 从ARM V7汇编层分析 if else和swith 语句效率
回到最开始的问题上,if else 和 swith两种语句从C语言角度来看都是顺序执行的,其效率最终还是看汇编层的优化程度。对于两分支语句,if else语句效率肯定是没问题的;对满足swith使用条件的多分支语句,且输入的条件变量是连续紧凑的正数值时,应优先使用swith语句。
2024-02-25 01:16:25
1431
1
原创 freeRTOS之软件定时器源码分析总结
图4 软件定时器任务数据流示意图如图4所示,应用程序通过API接口调用xTimerGenericCommand,将定时器和指令加入定时器任务的私有队列。定时器任务会根据队列中的指令,对指定的定时器进行启动、复位、停止等操作,并将倒计时的相关信息记录到延时列表中。同时,如果列表中由定时器存在,任务会记录最近的溢出时间并阻塞等待,当倒计时结束时,任务会被唤醒,应用程序注册的回调函数会被执行;在阻塞前,会将定时器任务加到命令队列的等待项中,即命令入队也会唤醒定时器任务。
2024-02-23 00:22:42
1460
1
原创 SOCKET网络编程
为什么叫套接字?socket的一种翻译是插座,一种解释是连接是由一对发送socket和接收socket组成,这两个插座是可连接的,两个应用程序通过插座就可以建立连接,实现通讯。应用程序通过系统调用进行socket(套接字)网络编程,实现数据的传输。所以,对于应用程序来说,套接字对应的就是一个文件(通过文件描述符来引用)。linux的内核会将对系统调用所交付的数据做进一步的传输处理。因此,从内核的角度来看,一个套接字对应着通信的一个端点。
2024-02-18 17:15:52
1114
原创 从系统I/O到网络编程
输入/输出(I/O)的定义是站在主存的角度来定义数据传输的,即从主存到外部设备为输出,反之为输入。在linux中,所有的I/O设备都被模型化为文件,包括网络、磁盘和终端等。从而,内核只需要抽象出一套文件相关的接口,就可以统一操作所有外部设备,这个统一的应用接口称为Unix I/O,通常包括以下几种:①文件:应用程序通过系统调用来访问I/O设备,内核则返回对应的文件描述符(file descriptor,一个非负整数),以标记该I/O设备,后续对该设备的所有操作都通过这个文件描述符来实现;②。
2024-02-17 18:07:36
928
1
原创 浅谈FreeRTOS之唯快不破
天下武功,唯快不破。FreeRTOS作为一款微控制器实时操作系统,其微内核,讲究极致的低资源消耗;其实时,追求的就是极致的快。本文主要从几个细节来阐述FreeRTOS为实时性所作出的努力。
2024-02-16 04:06:48
1474
1
原创 freeRTOS静态任务创建示例
随着功能安全愈发被重视,RTOS逐渐禁用动态内存,以牺牲RAM资源为代价,获得更高的稳定性。FreeRTOS V9.00及更高版本支持通过静态内存创建如任务、软件定时器、信号量等内核对象,其主要思想是不再从堆中分配内存,而是由应用软件注册静态缓冲区来创建对象。本文主要分析静态任务的创建及相关代码。使用静态内存分配创建任务主要由以下几个优点:①任务的任务控制块(TCB)和栈(STACK)可以放在指定的内存位置,内核将该控制权下方给应用软件;
2024-02-14 14:03:39
909
1
原创 NXP S32 CAN通讯调试总结
本文记录了基于NXP S32某款MCU的CAN通讯调试记录,不求面面俱到,着重分析了几处计数细节,包括过滤器掩码机制、CAN中断机制等。
2024-02-14 01:31:17
1758
1
原创 Using ld-The GNU linker阅读笔记(ld version 2)
本文主要是Using ld这篇英文文档的阅读笔记,部分内容引用自CSAPP的链接章节,作为总结和备忘,也分享给需要的人。部分我拿捏不准的词汇,将保留原文内容,以防止曲解。ld 包括.obj(object files)和.a(archive files), 主要作用是对这些文件内数据进行重定向,并进行完整的打包。通常来说,编译的最后阶段即是运行ld,而ld有着一套标准的语法,可以清晰明确的控制整个链接过程。
2024-02-11 00:13:57
1719
2
原创 freeRTOS(Arm M7)中断压栈分析
以Arm M7核为例,当CPU响应中断异常时,第一件事就是保存现场,进行压栈。如果当前使用的是任务堆栈,则压入PSP;如果使用的是系统主堆栈,则压入MSP。根据权威指南的说法,CPU在响应异常序列时,首先会进行压栈、取向量、更新寄存器(选择堆栈指针MSP/PSP,更新堆栈指针SP,LR及PC)这三部曲。取向量指的是指令总线从向量表中找到对应的异常向量,并在对应的服务程序的入口处进行取值,而更新寄存器部分则可以解释我的疑惑。
2024-02-08 01:15:36
1863
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人