自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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错误处理及跟踪调试

最后,系统开始运行,开始按调度规则启动应用层定义的任务。

2024-06-01 23:12:13 735

原创 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关注的人

提示
确定要删除当前文章?
取消 删除