![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
实时系统
文章平均质量分 64
我是标同学
我非常喜欢编程
展开
-
实时调度算法和可调度性测试为可持续性(sustainability)和自可持续性(self-sustainability)基本概念以及作用详解
可持续性(sustainability)可以针对 调度算法 和 可调度性测试 两个而言的。原创 2022-06-07 10:11:41 · 1191 阅读 · 0 评论 -
单核处理器实时任务调度中各种最优调度算法汇总
单核处理器实时任务调度中各种最优调度算法汇总原创 2022-06-06 18:56:02 · 486 阅读 · 0 评论 -
论文解读 实时调度关于非周期任务混合调度技术汇总
任务按照时间特性一般分为三种:Periodic 任务,严格周期到达 Sporadic 任务,有最小达到间隔 Aperiodic 任务,达到间隔无约束,也有可能是一次性任务Hard实时任务:截止期的错失造成严重后果,例如自动刹车任务Firm实时任务:截止期的错失同样是不允许的,但是不会造成严重后果Soft实时任务:截止期的错失是可以偶尔允许的,例如视频解码任务更多相关知识,看我其它实时调度文章,比如实时任务分类与术语_标biao的博客-CSDN博客实时操作系统在生活中应用举例_标原创 2022-04-23 22:50:08 · 1347 阅读 · 1 评论 -
论文解读 实时调度单调速率RM调度双曲公式上界原理 双曲线旋转平移
众所周知,RMS调度是周期实时任务最优调度策略,其可调度性判定,可以用双曲线公式判定。当2维情况下,曲线公式为 (X+1)(Y+1)=2,这个怎么就是双曲线的公式了呢,渐进性怎么就是-1呢,原来这是经过了旋转,平移后的坐标系中可以看出,就是双曲线了。我的推导过程如下:参考知识:双曲线_百度百科把椭圆(或双曲线,抛物线)旋转之后的方程怎么求_百度知道斜椭圆的一般方程或者参数方程_百度知道...原创 2022-04-21 16:52:20 · 614 阅读 · 0 评论 -
解读论文记录 指出经典的RMS证明过程小错误的一个论文的解读
众所周知,实时调度最经典的论文是C.Liu和Layland的RMS单调速率调度算法,是实时操作系统中最优的固定优先级调度算法C.L. Liu, J.W. Layland, Scheduling algorithms for multiprogramming in a hard-real-time environment, J. ACM 20 (1) (1973) 46–61.该论文的结论是正确的,但是该论文的证明过程存在两个瑕疵:改论文对于利用率最小化证明那里的case 2那儿错了 对于最原创 2022-04-18 23:45:53 · 549 阅读 · 0 评论 -
实时操作系统在生活中应用举例
火车自动驾驶的刹车系统(自动驾驶汽车自动刹车功能也是同理): 火车速度30m/s,火车头的探测器可以探索100米远,计算机的某个任务需要定时去读取该探测器数据,分析有没有障碍物,如果有,则输出刹车动作(刹车距离20m),否则该任务的本次周期结束。假设任务执行最长时间为2ms。很明显,如果该任务不能在截止期前完成,就会产生严重后果了,因此这个任务是hard real-time task,这个系统是一个实时系统。 问题: 1. 该任务确定为什么任务模型,Periodic,Sporadic,Fix-poin原创 2022-04-18 17:45:14 · 4517 阅读 · 0 评论 -
实时任务调度研究中的优秀论文解读笔记
论文:CCF A类期刊文章,大名鼎鼎的TC期刊,计算机皇冠期刊Davis R I, Zabos A, Burns A. Efficient exact schedulability tests for fixed priority real-time systems[J]. IEEE Transactions on Computers, 2008, 57(9): 1261-1276.问题:实时调度中,任务必须保证截止期得到满足,而在任务运行前进行理论分析的过程,称为可调度性分析(这个在一般桌面系统,原创 2022-04-15 10:42:37 · 556 阅读 · 0 评论 -
实时任务分类与术语
按照任务触发形式,Real-time tasks can be classified into three types:Periodic,Sporadic,Apepriodic。按照任务的截止期关键程度,可以分为:Hard,Firm,Soft因此,结合起来就有9种任务类型。原创 2022-04-13 16:18:41 · 962 阅读 · 0 评论 -
实时调度杂记(嵌入式实时操作系统设计规范)
Firm taskA task in which each instance must be either guaranteed to completewithin its deadline or entirely rejected.Lateness The difference between the finishing time of a task and its deadline (L =f − d). Note that a negative lateness means that a t.原创 2022-04-13 09:34:30 · 262 阅读 · 0 评论 -
处理器调试断点原理总结
关于调试,可以分为两方面,有硬件调试器(st-link,jlink,jtag等),无硬件调试器(Linux内核对其上运行的应用程序的调试)有硬件调试器比如stm32f4,连接了st-link调试器,打断点,就是在那个地址对应的内存写入一条BKPT指令,cpu运行到这儿就停住了,调试器可以让它进入函数,下一行等执行,调试器完全拿捏住了cpu,因此可以控制它。其它嵌入式开发的单片机调试也是同样的。这种会让cpu完全停在断点处,对于裸机程序(相当于操作系统单线程),没什么问题,但是对于操作系统多任务来原创 2022-01-16 16:05:45 · 1416 阅读 · 0 评论 -
嵌入式系统任务动态加载原理和过程
每个.c分别并行(它们是无关的)的用gcc -c 指令编译成每个.o 用ld -r指令将他们合并为一个.o 然后 nm -u 指令找出该.o中未定义的符号 nm -s 指令重定义这些符号地址,从别的已编译的a.out获得 用 gcc -o 指令生成最后的out文件上述得到的最后的out文件通过串口等方式,传输到已有系统中,按照text段data段bss段地址把该代码搬运到对应内存位置,即可运行啦。这个自己可以写个IDE进行实现,就是一个动态加载工具了,还是比较简单的。这个动态加载技术在很...原创 2021-12-24 00:28:22 · 832 阅读 · 0 评论 -
coq形式化验证学习进阶
(* TL m,表示取出m任务结构体里面的TL成员 *)原创 2021-10-25 16:27:59 · 461 阅读 · 0 评论 -
移植某一个操作系统OS到某一个板子的方法
完成我们目标的步骤应该是这样的(可以避免重复造轮子,还未必有人家造得好):看看这块开发板是哪家的(比如正点原子),然后去看看他们给的对应教程资料,是否含有该OS的例程,如果有,那问题解决。否则,转下一步 百度搜一下看看是否有大神已经移植过该OS到该板子上,如果有,那么下载他的代码,问题解决。否则,转下一步 看看这款处理器的厂家(比如nxp)是否做了对应的评估版,如果有,那么看看该厂家对应给的资料和库SDK,有没有该OS的例程,如果有,那只需要我们移植该工程到我们自己的开发板上即可,一般就是改改外设驱原创 2021-07-14 17:46:19 · 590 阅读 · 1 评论 -
MX6UL freertos过程分析
main函数中创建完任务xTaskCreate,然后调vTaskStartSchedulermain()xTaskCreate()vTaskStartScheduler()xPortStartScheduler()configSETUP_TICK_INTERRUPTSystemSetupSystick()/...原创 2021-07-14 12:39:42 · 916 阅读 · 0 评论 -
GUN汇编格式以及与ARMCC汇编的介绍以及转换
ARM汇编(cortex-m内核的stm32使用的)和Gnu汇编(cortex-a内核的MX6ULL处理器使用的)的转换将ARM ADS下的汇编码移植到GCC for ARM编译器时,有如下规则:注释行以"@"或""代替";" GET或INCLUDE => .INCLUDE 如:get option.a =>.include "option.a" EQU => .equ TCLK2EQUPB25=>.equTC...转载 2021-07-06 15:12:22 · 1588 阅读 · 0 评论 -
uCOS-Ⅲ中PendSV任务切换详细分析(运行模式切换会自动加载的内容)
当调用OSStartHighRdy()函数,会触发PendSV异常后,就需要编写PendSV异常(可以手动触发,也叫软中断)服务函数,然后在里面进行任务的切换。 PendSV异常服务中主要完成两个工作,一是保存上文,即保存当前正在运行的任务的环境参数;二是切换下文,即把下一个需要运行的任务的环境参数从任务栈中加载到CPU寄存器,从而实现任务的切换。 PendSV异常服务中用到了OSTCBCurPtr和OSTCBHighRdyPtr这两个全局变量,这两个全局变量在os....转载 2021-07-05 22:10:35 · 627 阅读 · 0 评论 -
arm cortex-a的运行模式切换自动完成哪些事情
关于arm cortex-a的运行模式和寄存器讲解看我这篇文章arm中SP,LR,PC寄存器以及其它所有寄存器以及处理器运行模式介绍可以通过软件来进行模式切换,或者发生各类中断、异常时CPU自动进入相应的模式;用户模式与系统模式两者使用相同的寄存器,都没有SPSR(Saved Program Statement Register,已保存程序状态寄存器),但系统模式比用户模式有更高的权限;系统复位或开机时则进入到SVC模式下;当遇到软中断(SWI,Software Interrupt)..转载 2021-07-05 13:38:33 · 598 阅读 · 0 评论 -
c语言和汇编中的#,##作用
说明一下:这些的作用都是编译的预处理阶段进行展开的,不是动态运行时候发挥作用的,说白了,就是编译器提供给我们的代码字符处理手段。方便我们写代码的。#x 用于给x添加双引号的“”只能配合用宏定义使用#define __STRINGIFY(x) #x__STRINGIFY(123)在代码中就是“123”我们来想个问题,我们现在有这样需求,想把一个对象A(可以是1,2,haha,也可以是“nihao”),我想让它与另一个对象B通过_连接成一个整体。那么我们可能会想着这样做:#d原创 2021-07-04 23:18:01 · 886 阅读 · 2 评论 -
关于头文件中的 static inline函数
加了static的关键字,不同c文件中同名函数,不会报重定义。关于头文件中的 static inline函数 头文件中常见static inline函数,于是思考有可能遇到的问题,如头文件经常会被包含会不会产生很多副本?网上说法不一。于是自己验证。 经过arm-none-eabi-gcc下测试后得出结论。 inline 关键字实际上仅是 建议内联并不强制内联,gcc中O0优化时是不内联的,即使是O2以上,如果该函数被作为函数指针赋值,那么他也不会内联,也必须产生函数实体,以获得该函数地...转载 2021-07-04 21:36:31 · 1302 阅读 · 0 评论 -
MX6ULL学习关于SDK中的重要文件
我学的是正点原子的MX6ULL开发板教程,感觉写得非常好,通俗易懂,学到了做嵌入式应该具备的知识,这款处理器的学习,让我知根知底cpu的运行原理,以及程序开发原理。原子的裸机例程中,有3个头文件(应该是从官方SDK中移植过来的),非常有用。在工程的imx6ul文件夹内,主要如下几个文件很关键:core_ca7.h:该文件内把所有寄存器的读写都用C语言实现出来了(通过c语言内嵌汇编的方式,更多语法可以看我这篇文章GCC内嵌ARM汇编与C语言相互调用(一文读懂!!!)),使用非常方便,这就是非常好的开发原创 2021-07-04 21:07:25 · 386 阅读 · 3 评论 -
GCC内嵌汇编与C语言相互调用(一文读懂)
我用的是arm cortex-a7内核的MX6ULL处理器,我用的编译器是交叉编译器:arm-linux-gnueabihf-gcc我发现按照文章ARM中C语言和汇编语言互相调用以及实例汇编调用c语言变量没问题,但是c语言中嵌入汇编,编译会报错。所以这里讲一下该情况下如何在c语言中嵌入汇编。Linux 的源码中,出现不少的内嵌汇编。__asm 是GNU C语言内嵌汇编关键字volatile 关键字,表示不要优化我后面的内容,即嵌入的汇编代码原封不动往往都会再进行一下...原创 2021-07-04 20:15:29 · 2732 阅读 · 3 评论 -
ARM中C语言和汇编语言互相调用以及实例
1.内联汇编在C语言中内嵌汇编注意事项:不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令 在使用物理寄存器时,不要使用过于复杂的C表达式(比如ADD y,R0 ,x/y(无形中就是c语言表达式,是允许的,但是这里刚好会影响R0寄存器的值了,也就是物理寄存器冲突,所以这里不能这样用)),避免物理寄存器冲突。 R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能将R0到R3、R12及R14用于子程序调用,因此要避免直接使用这些物理寄存器 一般不要直接指定物理寄存器,而让编译器.原创 2021-07-03 20:17:09 · 4218 阅读 · 0 评论 -
串口接收文件数据实现以及判定接收完成的方法
这里以二进制文本文件为例,有两个方法可以实现:在文件尾添加一个结束标志(与接收方约定好),当接收方检测到这个结束标志,认为对方发送结束。该方法也称为协议法,具体实现可以如下: 在文件头加一个协议,包括三个数据,u8 a,b,c,a标识该文件是目标文件,b为该文件字节数,c为给该文件添加的校验数据,使得该文件所有字节加起来等于0xff,可以防止漏掉数据。比如下面的协议头就很好: 对方接收到后,对应解析即可。 优点:对方断断续续发送也能正确接收完文件,不会漏掉,而且还有校验功能,更加安全可靠。 缺点原创 2021-06-30 23:22:34 · 8220 阅读 · 0 评论 -
uboot启动流程分析
第 14 行判断键盘是否有按下,也就是是否打断了倒计时,如果键盘按下的话就执行相应的分支。比如设置 abort 为 1,设置 bootdelay 为 0 等,最后跳出倒计时循环。第 26 行,返回 abort 的值,如果倒计时自然结束,没有被打断 abort 就为 0,否则的话 abort的值就为 1。回到示例代码 32.2.9.6 的 autoboot_command 函数中,如果倒计时自然结束那么就执行函数run_command_list,此函数会执行参数 s 指定...原创 2021-06-08 19:39:45 · 658 阅读 · 0 评论 -
U-boot移植学习
结构体初始化赋值可以这样:原创 2021-06-08 16:16:20 · 344 阅读 · 0 评论 -
uboot makefile学习2
原创 2021-06-08 10:27:40 · 255 阅读 · 0 评论 -
U-Boot makefile学习
31.3 U-Boot 顶层 Makefile 分析在阅读 uboot 源码之前,肯定是要先看一下顶层 Makefile,分析 gcc 版本代码的时候一定是先从顶层 Makefile 开始的,然后再是子 Makefile,这样通过层层分析 Makefile 即可了解整个工程的组织结构。顶层 Makefile 也就是 uboot 根目录下的 Makefile 文件,由于顶层 Makefile 文件内容比较多,所以我们将其分开来看。...原创 2021-06-07 12:58:40 · 337 阅读 · 0 评论 -
U-Boot学习
3、boot 命令boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统,bootcmd 是一个很重要的环境变量!其名字分为“boot”和“cmd”,也就是“引导”和“命令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内容是可以修改的。比如我们要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 为“tftp80800000 zImage; tftp 83000000...原创 2021-06-07 10:12:50 · 228 阅读 · 0 评论 -
嵌入式调试GDB使用
B3.1 GDB 简介gdb 工具是 GNU 项目调试器,基于命令行。和其他的调试器一样,我们可以使用 gdb 来一行行的运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等,它是 UNIX/LINUX 操作系统下强大的程序调试工具。gdb 支持多种语言,包括 Ada、汇编、C/C++、D、Fortran、GO、Objective-C、OpenCL、Modula-2、Pascal 和 Rust。关于 gdb 更多详细的信息请到 gdb 官网查阅,gdb 官网地址为:www.gnu.org。原创 2021-06-07 00:02:37 · 824 阅读 · 3 评论 -
操作系统bootloader是什么
在进行 Linux 驱动开发之前肯定需要先将Linux 系统移植到开发板上去。如果学习过 UCOS/FreeRTOS 应该知道,UCOS/FreeRTOS 移植就是在官方的 SDK 包里面找一个和自己所使用的芯片一样的工程编译一下,然后下载到开发板就可以了。那么 Linux 的移植是不是也是这样的,下载 Linux 源码,然后找个和我们所使用的芯片一样的工程编译一下就可以了?很明显不是的!Linux 的移植要复杂的多,在移植 Linux之前我们需要先移植一个 bootloader 代码,这个 bo原创 2021-06-06 10:33:16 · 960 阅读 · 2 评论 -
嵌入式中volatile
每个成员都使用“volatile”进行了修饰,目的是防止编译器优化。“示例代码 17.1.1.1”就是 STM32F103 的中断向量表,中断向量表都是链接到代码的最前面,比如一般 ARM 处理器都是从地址 0X00000000 开始执行指令的,那么中断向量表就是从 0X00000000 开始存放的。“示例代码 17.1.1.1”中第 1 行的“__initial_sp”就是第一条中断向量,存放的是栈顶指针,接下来是第 2 行复位中断复位函数 Reset_Handler 的入口地址,依次类推原创 2021-06-05 21:56:00 · 1415 阅读 · 6 评论 -
取余运算用%速度非常快但是只能用于整数和整数单片机运算整型数和浮点数时间开销差异非常大
取余运算%速度非常快,但是只能用于整数和整数之间,如果想小数之间用,就得自己定义一个取余函数,数学函数库fmod函数已经帮我们实现好了,可以直接调用。在单片机中整形数之间的运算,浮点数之间的运算,运行时间开销差异非常大,可能是单片机不带浮点运算单元FPU的原因导致的,我用的是stm32f1103,举例如下:float min_vs(float a,float b){ if(a<=b) return a; else return b;}...原创 2021-05-05 18:51:17 · 2798 阅读 · 0 评论 -
实时调度可调度性分析各种初值迭代问题
任务模型采用(B,C,D,J,T)情况1:可能会出现后一个任务的响应时间反而小于前一个任务的情况,这是因为有阻塞时间参数的原因,如果前面一个任务的阻塞时间很大(会算入本任务的响应时间里面,但是不会算入后一个任务的响应时间里面),那么它的响应时间就很长,而后一个任务的阻塞时间很小,就有可能后一个任务的响应时间反而更短。下面任务集就会这样:task1=(1,1,6,0,8),task2=(7,3,2,1,0,32),task3=(0,1,36,0,4),task2的响应时间为12,而task3的响应时间原创 2021-04-20 23:31:06 · 454 阅读 · 0 评论 -
实时调度响应时间分析算法迭代过程详解
其中RTA函数图像如下图所示:很明显,任务i,第一次收敛点Ri ,之后还有无穷个收敛点,因此,迭代初值选得好,收敛结束就快。下面是师兄论文的迭代收敛说明:可以进行下一步的写代码了...原创 2021-04-10 18:20:17 · 744 阅读 · 0 评论 -
实时调度领域知识汇总
任务模型(C,D,T)充要可调度性测试算法有如下几类:(论文Measuring the Performance of Schedulability Tests,2005。Efficient Exact Schedulability Tests for FixedPriority Real-Time Systems,2008) 响应时间分析(RTA,且后续都在改进它,让它尽快收敛,比如找一个更好的初值) 超平面测试分析 布尔返回方式分析 ...原创 2021-04-07 11:52:35 · 541 阅读 · 0 评论 -
SylixOS工程搭建编译报错与虚拟机连接不上connect timed out
按照按照目录下doc目录内的教程建立了base工程和app工程,可是编译app工程报错。解决方法:包括base工程,一起全部编译,就没问题了。因为导致这个问题是因为首次建立base工程,未编译,因此仅仅编译app工程会找不到对应的api等错误。虚拟机连接不上,sylixos显示Uploading files to 192.168.1.71 failed! connect timed out。这是因为首次建立了虚拟机,没有建立虚拟网络适配器导致的,需要首先在虚拟机软件设置里建立一个网络..原创 2020-12-01 19:08:38 · 696 阅读 · 0 评论 -
任务调度术语笔记
根据实例的到达时间特性不同,可以将任务分为周期性任务(periodic task)、偶发性任务(sporadic task)和非周期性任务(aperiodic task) [21] :周期性任务实例的到达有固定的周期;偶发性任务实例的到达没有固定的周期,但是有最小到达时间(minimal inter-arrival time)间隔的限制,在最坏情况下可以作为周期性任务对待;非周期性任务可能随时到达,没有最小到达时间间隔的限制。 ...原创 2020-08-01 11:32:42 · 686 阅读 · 0 评论 -
关于集合的一些理解
比如,任务模型t=(T,C),任务集合s={t1,t2...tn},tk(0<=k<+n)表示第k个任务,这样表示集合是可以的,不用担心里面有两个任务的周期和执行时间都一样,这样任务t1不就跟t2是一个东西了吗,错了,不是的,还是两个各自任务,不是相同元素,只是时间属性刚好相同了而已,根据集合里不能有相同元素,上述任务集的表示是合理的。...原创 2020-07-18 16:47:35 · 327 阅读 · 0 评论 -
stm32利用通用定时器实现函数运行时间精确测量
思路:采用TIM3,设置为向上计数模式,每次计数溢出(因为以72Mhz计数,stm32全为16位定时器,0.9ms就会溢出了),则变量加一,如此来测量。核心代码如下,测试过了,非常准确。extern u32 cntPeriod;void TIM3_Int_Init(u16 arr,u16 psc){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RC...原创 2020-07-13 12:31:05 · 9030 阅读 · 0 评论 -
stm32f1常见问题
MDK仿真,单步执行,如何在暂停过程使定时器暂停计数http://www.stmcu.org.cn/module/forum/thread-621714-1-1.htmlDBGMCU_Config(DBGMCU_TIM3_STOP,ENABLE); Keil MDK 代码提示快捷键https://blog.csdn.net/qq_41536436/article/details/87538697 CTRL+ALT+SPACE...原创 2020-07-13 10:40:46 · 485 阅读 · 0 评论