自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 收藏
  • 关注

原创 Linux调度策略

CFS的全称是completely fair scheduler,意思是完全公平调度。它的目标是让每个任务尽可能公平地获得CPU运行时间。首先定义了一个核心概念--虚拟运行时间(vruntime)用于管理每个任务在CPU上的运行时间。每一个任务都有一个vruntime,这个vruntime是根据任务的优先级和该任务所占权重计算得出的。当该任务运行时,其vruntime会逐渐增加。但是对于不不同优先级的任务来说,vruntime增加的速度是不同的;高优先级的增加慢,低优先级任务增加快。

2024-08-17 16:55:23 717

原创 C语言的内存布局

栈区用于存放函数内的局部变量、参数以及返回地址等,栈是一种后进先出的结构,它由编译器自动分配内存和释放,栈上的数据是临时的,在函数调用结束以后销毁,且栈区的大小是固定的,在程序运行之前就已经确定,访问速度快。堆区是一个动态内存储存区域,用于储存程序运行时的动态内存,它在程序运行时确定堆区大小,由程序员手动管理内存分配和内存释放,如通过调用malloc、calloc以及free函数来进行内存分配以及内存释放。此时a存储在RO段。}此时a是一个指针常量,指向字符串的第一个字符,此时这种情况a是存储在RO段的。

2024-07-09 14:37:09 441

原创 基于ucosii的车载电控单元

通过利用STM32F103C8、直流电机、按键、us015超声波测距模块、MPU6050、蜂鸣器、TFLCD、霍尔传感器等硬件设计一个车载电控单元,实现了手动加档、实时显示车速、超声波避障预警、车身倾斜预警以及更新固件功能,以保证行车安全。

2024-06-30 21:51:19 864

原创 基于stm32f103c8t6的串口IAP实验

在main函数中,发生了中断,此时PC指针会跳转到中断向量表去寻找对应的中断服务地址执行对应的中断服务函数,如图3、4所示。最后,我们要利用一个转换工具将keil生成的.hex文件转化为.bin文件,这是因为,hex文件指定了地址,bin文件没有指定地址,很明显,在IAP中,我们不需要系统自行指定,而是需要自己定制,因此需要转换为bin文件,这是keil安装目录下的fromelf.exe应用程序来做的,具体操作为:先点开魔术棒,在user选项卡输入以下内容,请按照自己的安装目录去填充,此处仅供参考。

2024-06-12 17:49:22 1621

原创 PendSV和SVC

PendSV异常也叫做可悬挂的系统调用,在操作系统中用于缓期执行一个异常,直到其他重要任务完成以后才执行异常动作,使用PendSV的方法是手工往NVIC的PendSV悬起寄存器里边写入1,即可开启PendSV异常。

2024-06-07 12:03:57 502

原创 关于ucosii操作系统原理------(三)内存管理

当用完这个内存控制块释放时,又将这个内存控制块归还内存控制块链表,用于新的内存分配。同样的,这一步链接成链表的操作也是在系统调用OSInit()函数时候完成的,也是定义了一个数组OSMemTb1[]数组来存放链表的各个节点,因为在OSInit()函数内部会调用OSMemInit()函数,该函数用于将OSMemTb1[]数组的各个元素链接成链表,并且各个节点进行初始化;接下来看看这个函数的源码:

2024-06-03 15:52:27 2141

原创 关于ucosii操作系统原理------(二)任务间通信

在ucosii操作系统中,为了在各个任务之间可以发生数据交换以及通信,因此创造出了信号量,互斥量、邮箱、事件标志组以及消息队列等方法来完成任务间的数据交换以及通信,任务之间传递的这些不同种类的信号被统称为事件,与TCB类似,这里也定义了一个事件控制块(ECB)来管理各个事件。本章节主要是讲解各个任务间通信函数的源码是如何实现的。

2024-06-01 17:29:41 832

原创 C语言常见错误题

上述代码输出的结果是2,5。原因是在于因此,在(int*)(&a+1)代表的是将整个数组地址右移,此时假设a整个数组的地址是0x1000,那么(&a+1)代表的就是整个数组的地址再右移动一个同样的&a类型的字节大小,也就是a数组有5各元素,一个元素占用4各字节,所以a共占用20个字节,那么(&a+1)的地址就是0x0000+20=0x1014;

2024-05-26 16:29:53 281

原创 bootloader基础概念

Bootloader也叫做引导加载程序。在嵌入式系统上电复位后首先运行引导加载程序,它的功能主要是负责系统的上电自检、必要的硬件初始化、建立储存空间映射,并加载和启动操作系统。Bootloader一般储存在bootROM中,当前使用最多的类型是NOR flash rom,在大多数的嵌入式系统中,flash里边不仅储存了bootloader,还储存了用户程序代码。

2024-05-21 12:15:39 349

原创 c语言程序如何控制硬件?

接下来CPU开始按照PC计数器上的地址顺序读取flash上的指令,这个过程叫做取指,这在CM3上是通过Icode总线去读取的。以后,先进行预处理展开宏定义、去掉注释等生成.i文件,接下来这个i文件会被编译器转换为汇编代码生成S文件,然后把汇编代码转换成目标文件也就是o文件,最后是链接,也就是将多个o文件和库文件链接起来,第二点就是至于跳转到操作系统的入口地址还是用户程序的入口地址,就要看你是跑操作系统还是裸机开发,如果你是裸机开发,就是跳转到用户程序的入口地址。加载操作系统的方式是方式一,也即是直接在。

2024-05-20 22:20:54 560

原创 关于ucosii操作系统原理---(一)任务调度

因此,ucosii也是借助这一思想,模仿刚被中断时,断点数据入栈,然后在中断程序执行完返回恢复断点数据时,此时把另一个任务的堆栈指针来替换掉当前需要返回的断点任务堆栈指针,不返回断点处继续执行,这样就发生了任务切换。在这个表中,给每一个任务安排了一个二进制位,1代表就绪,否则不就绪。这实际上是用一个U8类型的数组OSRdyTb1[]来充当这个任务就绪表,如下图所示,这是一个可以记录32个任务就绪状态的任务就绪表,这个数组一个元素可以代表8个任务的就绪状态,4个元素就可以代表32个任务的就绪状态。

2024-05-13 16:54:59 1596

原创 基于ucosii的厨房预警监测系统

uC/OS-II是一种实时多任务操作系统,由美国嵌入式软件工程师Jean Labrosse开发。它是通过源代码方式提供的,并且具有高度可移植性。uC/OS-II被广泛用于嵌入式系统、物联网设备和其他实时应用中。它提供了任务管理、内存管理、时间管理、中断管理和通信机制等功能,通过这些功能可以实现多个任务的并发执行,并确保任务之间的实时性和可靠性。uC/OS-II还具有较小的内存占用和运行效率高的特点,适用于资源受限的嵌入式系统。uC/OS-II中的每个任务都是一个循环。

2024-04-21 20:45:40 828 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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