自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(137)
  • 资源 (2)
  • 收藏
  • 关注

原创 shell变量

每一个变量的值都是。

2024-03-20 20:37:34 241

原创 四种bootloader

4、bootloader和APP可能都要用到各自的中断程序,但是有的芯片不支持硬件设置中断向量表的偏移SCB->VTOR(M3为例),这时候由bootloader的中断程序判断是APP的中断还是bootloader中断,如果是APP的新的中断就需要跳转到APP的中断程序。1、bootloader和APP都在芯片内部的XIP(excute in place)Flash上,bootloader直接设置PC等于APP的地址,运行APP程序(这里又分为APP带中断向量表和不带中断向量表)四种bootloader。

2024-02-27 08:59:11 287

原创 FreeRTOS任务切换分析

就是CPU寄存器的切换(从NEMU学习更有体会,计算机系统基础)假设当任务A切换到任务B时,主要分为两步:第一步:需暂停任务A的执行,并将此时任务A的寄存器保存到任务堆栈,这个过程叫做保存现场第二步:将任务B的各个寄存器值(被存于任务堆栈中)恢复到CPU寄存器中,这个过程叫做恢复现场。上下文切换。保存当前任务的现场、找到要切换的任务,恢复这个要切换任务的现场。

2023-12-16 11:57:17 258

原创 FreeRTOS调度器启动过程分析

在Free RTOS中MSP是给系统栈空间使用的,而PSP是给任务栈使用的,也就是说,FreeRTOS任务的栈空间是通过PSP指向的,而在进入中断服务函数时,则是使用MSP指针。因为Cortex-M4的中断优先级有点反直觉:在Cortex-M内核中,优先级的数值越大,表明优先级越低,数值越小代表优先级越高。首先是使用了PRESERVE8,进行8字节对齐,这是因为,栈在任何时候都是需要4字节对齐的,而在调用入口得8字节对齐,在进行C编程的时候,编译器会自动完成对齐操作,而对于汇编,就需要手动进行对齐。

2023-12-04 20:31:29 333

原创 FreeRTOS任务创建及细节

每个任务都有自己的任务TCB。任务TCB是一个相对比较大的数据结构,这也是情理之中的,因为与任务相关的代码占到整个FreeRTOS代码量的一半左右,这些代码大都与任务TCB相关,我们先来介绍一下任务TCB数据结构的定义,任务控制块就相当于每个任务的“创建任务首先申请了任务控制块TCB和任务堆栈的内存空间,然后就是初始化堆栈空间的内容,因为,创建任务其实我个人理解就是任务创建属于任务运行时的一种特殊状态,所以创建任务的时候它的栈肯定也是一种形式,所以必须要初始化它的堆栈,然后任务才可以运行。

2023-11-27 22:45:23 305

原创 FreeRTOS列表和列表项

FreeRTOS内核调度使用了大量的列表(list)和列表项(listitem)数据结构。它的源码中涉及到很多列表的操作,对于FreeRTOS来说,列表就是它最基础的一部分,列表被用作FreeRTOS调度器使用,用于跟踪任务,处于就绪,挂起,延时的任务都会被挂接到各自的列表中,用户程序如果有需要,也可以使用列表,其中就连FreeRTOS的任务调度其实核心也涉及到列表。FreeRTOS列表使用指针指向列表项。一个列表(list)下面可能有很多个列表项(list item),每个列表项都有一个指针指向列表。

2023-11-22 22:48:30 768

原创 FreeRTOS内存管理分析

内存管理对应用程序和操作系统来说非常重要,而内存对于嵌入式系统来说是寸土寸金的资源,FreeRTOS操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些函数的具体实现。这样做大有好处,可以增加系统的灵活性,不同的应用场合可以使用不同的内存分配实现,选择对自己更有利的内存管理算法。比如对于安全型的嵌入式系统,通常不允许动态分配内存,那么可以采用非常简单的内存管理策略,一经申请的内存,甚至不允许被释放。

2023-11-21 22:38:30 199

原创 Linux0.11——操作系统怎么把自己从硬盘搬到内存

bootsect.s文件就是把操作系统的代码挪来挪去,最后形成上面的内存结构i,然后做了一次比较重要的内存规划,方便后续代码的执行时,数据段和代码段以及栈段的寻址方式。

2023-09-26 19:49:10 565

原创 Linux0.11——第三回 做好访问内存的最基础准备工作

到这里最操作系统最最最基础的准备工作就做好了。把代码从硬盘移动到内存,又从内存移动到另一个地方0x90000。数据段寄存器ds和代码段寄存器cs此时都被设置成了0x9000,也就是为了跳转代码和访问内存数据,设置了一个内存的基地址,以方便代码的编写。栈顶地址被设置成了0x9FF00,具体表现为栈段寄存器ss为0x9000,栈指针寄存器sp为0xFF00.现在仅仅是考虑启动区的512字节代码,不难想到像BIOS一样,操作系统还有很多代码位于硬盘中,不能抛下它们不管啊。

2023-09-23 22:14:35 152

原创 Linux0.11——第二回 从0x7c00到0x90000

第一讲就是由BIOS把启动区的代码复制到内存地址0x7c00处,由于x86寻址方式的历史兼容原因,所以需要段基址左移4位,然后就是把0x7c00的512启动区的数据复制到0x90000地址处。然后接着运行。

2023-09-23 21:57:49 280

原创 Linux0.11——第一回 最开始的两行代码

按下开机键,CPU 将 PC 寄存器的值强制初始化为 0xffff0,这个位置是 BIOS 程序的入口地址(一跳)该入口地址处是一个跳转指令,跳转到 0xfe05b 位置,开始执行(二跳)执行了一些硬件检测工作后,最后一步将启动区内容加载到内存 0x7c00,并跳转到这里(三跳)启动区代码主要是加载操作系统内核,并跳转到加载处(四跳)BIOS负责加载了启动区,而启动区又负责加载真正的操作系统内核。

2023-09-21 19:51:40 132

原创 Linux设备树由来

大势所趋!!!

2023-09-15 20:56:35 51

原创 常量指针和指针常量

常量指针:具有只能够读取内存中数据,却不能够修改内存中数据的属性的指针,称为指向常量的指针,简称常量指针。顾名思义,常量指针就是指向常量的指针,指向的对象可以改变,但是指向对象的值是不能改变的。指针常量必须在声明的同时对其初始化,不允许先声明一个指针常量随后再对其赋值,这和声明一般的常量是一样的。指针常量必须在声明的同时对其初始化,不允许先声明一个指针常量随后再对其赋值,这和声明一般的常量是一样的。指针常量:指针常量是指指针所指向的位置不能改变,即指针本身是一个常量,但是指针所指向的内容可以改变。

2023-08-31 10:47:03 83

原创 ICS PA1

PA1主要负责完善相关实验的基础设施,因为使用gdb调试客户程序时,想在客户程序s设置断点等,不是很方便。基础设施相当于实现了一个简易的gdb调试器。NEMU是一个用来执行客户程序的程序,内存是被定义成一个大数组,CPU是一个结构体,模拟CPU的执行过程:取值、译码、执行、更新PC表达式求值:词法分析、语法分析(分析表达式的结构)、递归求值PA1相当于是设置一个最简单的计算机——图灵机,只有最简单的硬件,NEMU是模拟一个最简单计算机的硬件:CPU、内存、寄存器、PC、加法器。

2023-08-24 20:13:51 1629

原创 ICS PA0

所以当我们通过执行命令。对比可知,我们可以知道,$

2023-08-09 22:50:14 294

原创 GNU diff format

Linux Diff Command Help and Examples (computerhope.com)git diff 格式详细说明(转) - 简书 (jianshu.com)

2023-07-26 21:19:09 250

原创 C++ Stream总结

(4条消息) C++ 流(stream)总结_c++ stream_浩世轩宇的博客-CSDN博客

2023-07-26 16:06:39 224

原创 正则表达式

正则表达式30分钟入门教程 (deerchao.cn)Regular Expression Tutorial - Learn How to Use Regular Expressions (regular-expressions.info)

2023-07-25 21:13:44 303

原创 Linux系统基础(一)——认识和安装Linux

例如,某个分区(如/dev/sda7)可以被挂载到/usr/local目录下,这意味着文件/usr/local/man/whatis将位于分区/dev/sda7上,而不是分区/dev/sda5上。例如,如果分区/dev/sda5被挂载在目录/usr上,这意味着所有在/usr下的文件和目录在物理上位于/dev/sda5。Linux系统使用字母和数字的组合来指代硬盘分区,使用一种更加灵活的分区命名方案,该命名方案是基于文件的,文件名的格式为/dev/xxyN(比如/dev/sda1分区)x:偶数表示稳定版本;

2023-07-24 22:47:46 81

原创 Git学习

注意:这里需要注意的是,回到上一个版本容易但是要想再回来就比较难了,因为这里其实可以和C语言的指针作为理解,Git的版本回退速度非常快,因为在Git内部有个指向当前版本的HEAD指针(头指针(个人理解)),当你回退版本的时候,Git仅仅是把HEAD从指向当前版本指向到上一个版本号,但是新版本的没有保存,相当于指针丢失了(野指针)。什么是修改,比如你新增了一行,这就是一个修改,删除一行,这也是一个修改,更改了某些字符,这也是一个修改,删了一些又增加了一些,也是一个修改,甚至创建一个新文件也算一个修改。

2023-05-01 17:02:30 1053

原创 GDB Debug

有一部分要付费..........

2023-04-28 22:42:39 102 1

原创 数据的表示和存储——

1、任何一个实数都可以用一个定点整数和一个定点小数来表示,其中定点整数其实就是指的整数(来表示科学计数法中的指数部分),定点小数一般表示科学计数法中的小数部分(尾数)。2、浮点数是有精度的,之前是不知道为什么有的浮点数在计算机中是没有办法存储和表示的,只能根据某个特定的规则进行舍入和表示,而且浮点数数字越小越有可能精确表示,对于浮点数越大,精确表示的可能就越小,因为数越大,可表示的两个浮点数之间的距离越来越大。

2023-04-15 16:50:09 879

原创 数据的表示和存储1

Q&AQ1: 在有些32位系统上,C表达式-2147483648 < 2147483647的执行结 果为false。Why?A1: 在ISO C90标准下,2147483648为unsigned int型,因此 “-2147483648 < 2147483647”按无符号数比较, 10……0B比01……1B大,结果为false。在ISO C99标准下,“-2147483648 < 2147483647”按带符号整数比较, 10……0B比01……1B小,结果为true。

2023-04-13 14:56:30 472

原创 计算机系统基本组成于基本功能

C语言程序设计层数据的机器级表示,运算语句和过程调用的机器级表示操作系统、编译和链接指令集体系架构(ISA)和汇编层指令系统、机器代码,汇编语言微体系结构和硬件层CPU的通用结构层次结构存储系统1、冯诺依曼的结构:运算器+存储器+控制器+I/O设备2、冯诺依曼结构的最重要的思想就是:采用“存储程序”的思想3、控制器(控制):对指令译码生成控制信号4、计算机实现的所有任务都是通过执行一条一条指令完成的。5、计算机是采用“存储程序”的工作方式。

2023-04-11 22:51:38 908

原创 计算机系统基础概述

永远记住一句话,机器永远是对的!!!程序的执行结果不仅仅依赖于高级语言的语法和语义,还与其它好多方面有关。所以这必然要求理解程序的执行需要从一个系统的角度来思考,而不是仅仅只关注于语言的语法和语义,从系统角度思考问题。

2023-04-11 18:10:39 51

原创 Linux Shell脚本编程

Shell脚本是一种简单的编程语言,它由一系列命令组成,这些命令可以在命令行中逐个执行。它通常用于自动化常见任务,如文件管理、文本处理和系统管理。

2023-03-31 18:20:09 411

原创 Linux常用命令

命令本质上就是可执行程序这些命令都是平常使用常见的命令,像cd,ifconfig等无需刻意死记这些命令,随着使用Linux命令的次数增加以及遇到问题后查找之后,很快就会有更深刻的记忆,慢慢的就能记住,最根本的就是熟能生巧。参考博客Linux 命令大全 | 菜鸟教程 (runoob.com)

2023-03-28 23:49:39 436

原创 Linux的编译知识

在链接过程中,链接器会将 hello.o 中的符号引用解析为实际的地址,并将其与其他库文件链接起来生成可执行文件 hello。编译是指将预处理后的代码翻译成汇编代码,同时对代码进行语法检查、类型检查等操作,生成目标文件。交叉编译是指使用一台与目标系统不同的计算机(比如使用x86架构的计算机编译ARM架构的代码),通过交叉编译工具链进行编译生成可在目标系统上运行的程序。交叉编译的优势在于可以在速度较快的开发计算机上进行编译,生成针对目标系统的可执行文件,以节省目标系统上的时间和资源。

2023-03-28 21:41:50 722

原创 Linux的基础知识

inode是用来存放文件信息的,每个文件都会有一个inode,并且这个inode号是唯一的,文件的内容都是inode来指定的,而不是文件名,就类似于之前讲的UID号和用户名之间的关系,当系统要访问文件时,inode就会被复制到内存,从而实现文件的快速访问,使用ls -i命令则可以看到inode号,-i参数为打印文件的inode号硬连接只是一个新的链接到某个inode号码的记录而已,这个链接指向inode,系统并不给他重新分配inode可以用ln命令来建立硬连接格式:ln 源文件 目标文件。

2023-03-22 20:12:58 2917 2

原创 Vim编辑器使用

Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。vim 则可以说是程序开发者的一项很好用的工具。连 vim 的官方网站 () 自己也说 vim 是一个程序开发工具而不是文字处理软件。vim是vi的加强版。

2023-03-21 11:33:21 1422

原创 Linux用户和用户管理

其实说白了就是Linux系统不是通过用户名来识别用户的,而是因为不同的用户在Linux中是不同的UID号,而对于像公司里面的话,经常是多个人共用一个Linux服务器,而一般而且不同的部门都只能访问各自部门的文件和拥有对应的权限,所以又有一个组的概念,不同的组就是不同的GID号。用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段(难怪以前windows在实习的时候,提醒我改密码)用户组:一对一,一对多,多对一,多对多。

2023-03-20 21:45:44 229

原创 Linux简介

UNIX(贝尔实验室):最早的多用户、多任务操作系统,Unix在1979年后商业收费。创始人:Linus Torvalds,在1991.10.05发布第一个版本。曲线救国:gcc/glibc/bash shell/emacs。UNIX、Minix、GNU、Linux的历史渊源。Minix(谭宁邦):定位教学用途,没有发展壮大。Linux:学习Minix,借助GNU软件。GNU(史托曼):建立free UNIX,发展:现在几千万行代码。Hurd诞生,为时已晚。

2023-03-20 21:13:39 49

原创 数据结构——栈和队列实现

下面得代码中文均是采用的GBK编码方式,所以赋值粘贴时要选择成GBK形式避免乱码。

2023-03-13 21:46:20 70

原创 数据结构——线性表

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。线性表(a1,a2,......an)的顺序存储结构如下:举个例子,有个同学,人特别老实,热心,经常帮室友去图书馆占座,他总是答应,如果一个宿舍九个人,他每一次吃完早饭,就冲去图书馆,挑一个好地,把他书包里的书一本一本的按座位放好,这里连续的九个位置就相当于是一个顺序存储结构。

2023-03-12 14:35:41 1163

原创 数据结构——线性表

【代码】数据结构——线性表。

2023-03-06 22:24:16 91

原创 数据结构——基本概念

数据结构中分为。

2023-03-03 15:32:48 392

原创 数据结构前提知识

这里学到了以前没有体会到的概念:数据名就是一个指针常量,它是指向数组的第一个元素的地址函数名其实也是一个指针常量,它指向函数的地址,函数指针就是这个思想int *p = aint *q =&a //虽然这里可以看到,&a和a其实都是指的数组的第一个元素,打印出来结果都是第一个元素的地址//但是二者的偏移是不同的, p =(char *) a+1尽管a 和&a的值是一样的,都是数组的首地址,但是类型不一样a作为地址是 int *类型的,

2023-03-01 09:40:06 145

原创 FreeRTOS优先级翻转

任务优先级翻转在实时操作系统中是不允许出现的,使用互斥量的优先级继承可以解决优先级翻转的问题,但是这里只是能够降低优先级翻转带来的影响,而不能完全消除优先级翻转带来的问题,通俗的说,虽然低优先级任务优先级提高了,但是还是要等优先级低的任务执行释放操作,高优先级任务才可以得以运行,这里只是解决了介于低优先级和高优先级之间中优先级任务带来的问题。比如没有引入互斥量,高优先级需要等待L+M任务运行的时间,引入之后只有任务L运行的时间。一句话:优先级翻转可以减轻,但不能完全消除。

2023-02-26 15:25:34 689

原创 FreeRTOS信号量

信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。其中,“同步”指的是任务之间的同步,即信号量可以使得一个任务等待另一个任务完成某件事后,才继续执行;而“有序访问”指的是对被多任务或中断访问的共享资源(如全局变量)的管理,当一个任务在访问(读取或写入)一个共享资源时,信号量可以防止其他任务或中断在这期间访问(读取或写入)这个共享资源。信号量是一种特殊的队列,其中二值信号量是长度为1的队列,计数型信号量是长度大于1的队列。

2023-02-25 20:24:40 1088

原创 FreeRTOS的Delay函数

使用xTaskDelayUtil(&Pre,n)时,前后两次退出xTaskDelayUntil的时间至少是n个Tick中断。flag为1时表示,Task1正在运行,flag为0时表示Task2正在运行,也就是Task1处于阻塞状态。使用vTaskDelay(n)时,进入,退出vTaskDelay的时间间隔至少是n个Tick中断。个人感觉这两个延时函数就是,比如一个我等3个小时,一个是我等到下午3点的区别。vTaskDelayUntil:指定的是任务执行的间隔,周期。vTaskDelay:指定的是阻塞时间。

2023-02-25 17:19:10 1360

RISCV Reference

RISCV Reference

2023-06-12

10_I2C_EEPROM.rar

基于野火STM32开发板的I2C读写EEPROM

2022-01-09

Template.rar

STM32固件库模板

2022-01-04

空空如也

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

TA关注的人

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