- 博客(173)
- 资源 (19)
- 收藏
- 关注
原创 The C programming language (second edition,K&R) exercise(CHAPTER 8)
Excercise8−1Excercise\quad 8-1Excercise8−1:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <stdarg.h>enum fileDescriptors { STDIN, STDOUT, STDERR };voi
2024-08-13 19:45:11 431
原创 The C programming language (second edition,K&R) exercise(CHAPTER 7)
【代码】The C programming language (second edition,K&R) exercise(CHAPTER 7)
2024-08-06 19:41:50 852
原创 The C programming language (second edition,K&R) exercise(CHAPTER 6)
才会被打印出来,否则这个变量不会被打印出来。:这里需要注意的是对于一个变量。变量且这个变量从第一个字符开始。连续的字符相同的情况下。
2024-08-02 20:20:23 547
原创 The C programming language (second edition,K&R) exercise(CHAPTER 5)
Excercise5−1Excercise\quad 5-1Excercise5−1:输出如图1所示。#include <stdio.h>#include <stdlib.h> #include <math.h> int getint(int *pn);/* reverse Polish calculator */int main(){ int num=0; int ret
2024-07-30 10:50:46 369
原创 The C programming language (second edition,K&R) exercise(CHAPTER 4)
Excercise4−1Excercise\quad 4-1Excercise4−1:#include <stdlib.h>#include <stdio.h>#include <string.h>int strindex(char s[],char t[]);int strrindex(char s[],char t[]);int main(void) { char s[100]="q
2024-04-21 09:25:00 736 1
原创 The C programming language (second edition,K&R) exercise(CHAPTER 3)
输出结果如图1所示,这里故意让二分搜索算法去寻找一个在数组中不存在在的数,然后去看两种二分搜索算法分别所花费的时间的大小,为了使得所花费的时间更具有可分辨性,这里让搜索过程重复执行了。型可以表示的最大正数的值大一(其它类型的有符号数的类型也是一样的),当我们在尝试使用书中的那个版本的。循环只会运行一次且就算是这一次对个位数的转换也是错误的,这是因为这一次循环中。也就是不为0就可以继续执行循环,且改进后的程序在求余数之后做了绝对值的操作。型可以表示的最大负数的转换,改进后的程序在判断。
2024-04-11 11:01:26 1064
原创 The C programming language (second edition,K&R) exercise(CHAPTER 2)
的二进制表示的最右的比特值为1的比特位后面所有为0的比特位的值都变成1,因此总的来说操作。的二进制表示基本一样,除了二进制表示的最低位为0,那么此时操作。的二进制表示的最右的比特值为1的比特位的值变成0,同时将。的比特值为1的比特位清零,因此可以利用这个现象来统计。的比特值为1的比特位清零,其它位保持不变。的二进制表示的最低位肯定为1,那么此时。位清零,其它位保持不变。中比特位的值为1的比特位的个数。,那么它的二进制表示为。,那么它的二进制表示为。为奇数还是偶数,操作。
2024-04-08 11:33:26 1259 1
原创 STM32的API接口的BIN文件的生成以及调用
文件尽可能的小且方便调用,这里额外的定义了一个用来存储每个接口的函数指针的结构体并定义了一个对应的结构体变量且初始化为每一个。接口我们可以这样操作,定义一个指向前面定义的存储每个接口的函数指针的结构体的指针变量且赋值为。),然后对每个接口的调用就很简单了,可以像是调用普通的函数一样调用。文件的内容如图3所示,最前面两个字的内容就是我们这里定义的两个。文件的形式给别人进行调用,下面介绍的方法可以使得生成的。文件下载到了对应的存储空间区域,此时如果需要调用。文件存放的存储区域的起始地址(这里假设从地址。
2024-04-01 14:51:54 941
原创 The C programming language (second edition,K&R) exercise(CHAPTER 1)
函数的情况下要求可以打印出任何长度的输入行的长度以及尽可能多的文本。在书中的初始程序中当输入行的长度超过允许的最大长度时,返回的长度就是这个允许的最大长度,而不是当前行的实际长度,下面两个实现分别只修改。函数实现了当输入行的长度超过允许的最大长度时,返回的长度是当前行的实际长度。:对于这一题的具体要求我没有弄清楚,下面的代码实现是基于线面代码的原作者以及。我对该题的意图的理解是对于字符数较多的行,每隔特定。是为了处理处理的字符流的最前面就是一个或多个的。按键的作用,这里我们简单的用下面的程序演示一下。
2024-03-27 10:56:55 1437
原创 跟着野火学FreeRTOS:第二段(任务通知)
接收通知的任务如果没有接收到任务通知的话就一直处于等待状态,发送任务通知的任务检测到按键按下就发送任务通知给接收任务通知的任务。等都可以用来实现任务之间的通信,这里我们介绍的任务通知也可以用来实现任务之间的通信,任务通知和前面我们介绍过的实现任务之间的通信的方法最大的区别是,在使用任务通知之前不需要创建某个对象,但是对于。任务通知可以实现我们前面介绍过的那些实现任务之间的通信的方法实现的功能,只不过相对的是一个轻量化的版本,不能完全取代,它们各有优缺点。表示任务通知的状态,收到或者没有收到任务通知,
2024-03-08 20:23:54 982
原创 使用J-Link Commander通过J-LINK以命令的形式来访问ARM通用MCU
通常我们的操作是写好程序然后将程序下载到芯片里面,然后运行程序来进行相应的操作,其实还可以使用。硬件之外还需要安装图1所示的软件,根据自己的平台来安装,安装完之后我们这里主要用到的是图2中的。现在软件和硬件都有了,我们来看一下如何用命令的形式来访问ARM通用MCU,这里以。的一页需要多个操作寄存器的命令,这时我们可以把所有这些命令放到一个文件里面,文件扩展名为。和芯片建立联系,联系建立之后就可以开始使用上面的链接提到的命令。所在的目录,如图3所示,然后可以用下面带参数的命令来建立图2的。
2024-03-06 16:26:55 1939
原创 ARM单片机中程序在ROM空间和RAM空间的分布(分散加载文件,Scatter-Loading Description File)
分散加载文件的使用
2024-03-05 20:49:06 1159
原创 跟着野火学FreeRTOS:第二段(软件定时器)
软件定时器本身是不占用任何处理时间的,除非软件定时器的回调函数正在执行。其实软件定时器的创建就是初始化了软件定时器控制块,每一个创建的软件定时器都有一个软件定时器控制块和其对应,软件定时器控制块需要占用。下面的例子创建了一个一次性的软件定时器(周期为3秒)和一个周期性的软件定时器(周期为2秒),回调函数只是简单的打印出当前的。图3和图4分别是周期性的软件定时器和一次性的软件定时器的状态迁移图。软件定时器的回调函数其实是在一个特殊的任务里面执行的,这个任务叫做。,那么这个软件定时器是周期性的定时器,每过。
2024-03-04 15:13:50 958
原创 跟着野火学FreeRTOS:第二段(堆存储管理)
这里的存储空间的分配算法的流程是首先从空闲链表的起点开始直到找到第一个比所请求分配的存储空间大于等于的空闲块,然后把这个空闲块分配给相应的内核对象,从前面我们知道每一个空闲块的最前面存储的是这个空闲块对应于在空闲链表中的节点,但是当这个空闲块分配给内核对象的时候,这个空闲块前面存储这个空闲块对应于在空闲链表中的节点的空间内核对象是没有使用的,这一点要注意。不仅对请求的存储空间的大小有对齐操作,对每次分配的存储空间的起始地址也有对齐的操作(假设是8个字节对齐的话,如果准备从图1的数组定义的存储空间的地址。
2024-02-29 13:53:31 875
原创 跟着野火学FreeRTOS:第二段(事件组)
在小节里面介绍了二进制信号量,计数信号量,互斥量和递归互斥量等功能,其中二进制信号量和计数信号量(也包括队列)常用于任务和任务之间以及任务和中断之间的同步,她们具有以下属性:当等待的事件没有发生的时候可以让等待的任务进入阻塞状态当等待的事件发生之后可以将因为等待事件发生而进入阻塞状态的任务唤醒,如果有多个任务在等待同一个事件发生的话,那么此时被唤醒的是优先级最高的任务,其它任务依然还是处于阻塞状态。 &n
2024-02-23 17:14:29 1009
原创 跟着野火学FreeRTOS:第二段(二进制信号量,计数信号量,互斥量,递归互斥量)
当互斥量用于互斥操作的时候,互斥量可以看做是和一个被两个或多个任务共享的资源(这里和前面的计数信号量里面介绍的资源管理不同的是这里的资源就一个,如果这个资源被某个任务获取了权限使用的话,其它任务就得等待该任务使用完之后才能使用,而计数信号量里面介绍的资源管理里面的资源是可以有多个的)相关的令牌(图16的例子是使用二进制信号量来进行互斥资源管理的,二进制信号量是不支持优先级继承机制的,下面我们来看一下使用具有优先级继承机制的互斥量之后,图16中的例子的运行情况又是什么样子的,这里假设任务。
2024-02-02 14:41:55 751
原创 跟着野火学FreeRTOS:第二段(队列管理)
参数,当这个参数不为0的时候,如果任务在尝试读队列的时候,队列为空,这时任务会进入阻塞状态等待其它任务或中断服务程序往这个队列里面写入数据,如果在参数配置的时间之内有其它任务或中断服务程序往这个队列里面写入了数据,那么这个处于阻塞状态的任务会立即转换为就绪态,假设在参数配置的时间之内没有其它任务或中断服务程序往这个队列里面写入了数据,这个处于阻塞状态的任务也会自动转换为就绪态。)的优先级大于数据接收任务的优先级,因此轮到接收数据的任务接收数据的时候队列应该已经满了,所以接收任务的阻塞时间设置为0。
2024-01-23 16:31:33 1024
原创 跟着野火学FreeRTOS:第二段(代码移植+任务创建+启动流程)
使用动态创建任务的接口的时候自动分配和释放的空间来自于。系统,接着运行创建任务的任务,这个任务是专门用来创建系统中所需的所有任务的,这个任务运行结束之后,系统所需的所有任务也就是创建完毕了,因此此时这个创建任务的任务也就不需要了,直接删除,在前面的例子中我们使用的就是这种启动流程。内核源码的一些参数,这些参数的具体值需要根据自己的应用需求以及所使用的芯片来决定,定义这些参数的主要是一些宏定义,至于这些宏定义的具体含义我这里就不讲解了,具体可以看看野火的说明,我这里为了方便直接使用野火的这个头文件。
2024-01-10 14:32:03 1238
原创 跟着野火学FreeRTOS:第一段(时间片)
在前面的小节中,每一个优先级下最多只有一个任务,那假如现在当前优先级数最高的优先级数下有多个任务,那此时这多个任务该如何执行。那此时这里就涉及到时间片的概念,时间片的概念简单说就是当某个优先级数下有多个就绪的任务时,这多个就绪的任务轮流执行单位时间,也就是轮流占用。下面这一段的作用是如果某个任务刚刚结束延迟,也就是刚刚从延迟列表删除并加入到就绪列表,并发现它的优先级高于正在运行的任务的优先级,此时也需要进行一次任务的切换,切换到这个高优先级的任务。的任务基本一样,采用采用延时列表的延时接口。
2024-01-03 11:46:38 991
原创 跟着野火学FreeRTOS:第一段(任务延时列表)
延时列表实现延时的基本思想是,当任务需要延时的时候就将任务插入到延时列表,不让任务继续执行且将任务从就绪列表里面删除,同时记录延时结束的时刻,延时结束的时刻为当前的记录。的值更新为这个延时列表中最早延时结束的任务的延时时刻并跳出循环,否则将当前延时列表中最早延时结束的任务从延时列表删除并加入到就绪列表并继续循环。周期,任务1先调用延时操作,任务2后调用延时操作,那么此时任务1的结束时刻为5,任务2的结束时刻为10,但是这里。该接口首先记录此时的。的值总是所有任务中延时结束时刻最早的任务的结束延时的时刻值。
2023-12-24 17:40:41 1246
原创 跟着野火学FreeRTOS:第一段(优先级)
任务可以被调度的前提是它有被挂载在就绪列表中(还在延时中的任务应该就不会放在就绪列表了,应该会被刚在阻塞列表,这个后面会讲到),就绪列表可以说就是一个链表的数组,就绪列表的每一个元素都是一个链表的根节点,数组的索引越小,表示挂载到这个链表上的任务的优先级最低,所以空闲任务挂载到索引为0的链表中。(相对于源代码中的定义有改动,只是简单的将对应的优先级比特位置0,而不是先判断该比特位对应的优先级下是否还有就绪的任务存在,只有当该比特位对应的优先级下没有有就绪的任务存在的时候才将对应的优先级比特位置0。
2023-12-24 11:04:07 942
原创 跟着野火学FreeRTOS:第一段(空闲任务与阻塞延时的实现)
中任务1和任务2的建立基本没有区别,只是这个任务需要插入到就绪列表数组中索引为0的链表中,这是因为空闲任务在系统中的优先级是最低的,只有当前没有任务执行或任务需要延迟的时候采取执行它,就绪列表数组的索引号就代表着挂到该元素对应的链表里面的任务的优先级,索引号越大,优先级越高。资源,就算此时没有任何任务需要执行那我们就可以执行我们专门建立的一个空闲任务,这个空闲任务可以上什么都不干或者进入低功耗模式来节能,当相应任务的延时到期的时候再转去执行对应的任务,这样的话。的值为0的时候才会再次恢复执行。
2023-12-21 16:45:26 924
原创 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)
在裸机系统中,系统的主体就是CPUCPUCPU按照预先设定的程序逻辑在mainmainmain函数里面顺序执行的无限循环。在多任务系统中,根据功能的不同,把整个系统分割成一个个独立的,无限循环且不能返回的的函数,这个函数我们称为任务。 在几乎所有的处理器架构中都会用到STACK,栈STACK,栈STACK,栈这种数据结构,它用来存储函数调用的参数,局部变量。当异常发生的时候它也可以用来存储
2023-12-20 15:41:47 972
原创 跟着野火学FreeRTOS:第一段(基础介绍)
多任务相比起前后台实时性进一步提高,主要体现在事件执行的实时性提高,只要当前的事件的优先级够高的话,可以马上执行,不会像前后台那样还有可能需要等待一段时间(假设在中断响应事件2的时候已经有事件1正在执行,那么中断响应事件2之后只有等待事件1执行完之后才能开始执行事件2)。的时候,事件2和事件3的执行请求被触发,这样事件2和事件3的执行标志会被相应的中断立即置1,但是事件2和事件3并不会马上被执行,只有在执行完事件1之后才会接着执行事件2最后才是事件3。这里在插入之前的链表是一个空的表,没有实际的链表元素。
2023-12-15 14:22:09 1233
原创 STM32的RTC模块的难点推导
异步预分频功能模块和同步预分频功能模块都有一个对应的向下计数器,其配置的值就是向下计数器的初始值,每当向下计数器的值到达0的时候会重新加载这个配置值。当异步预分频功能模块的值为1,2,或3(对应寄存器位域的配置值为0,1,2)的时候,从上面的推导可以看出在不同的校准周期和不同的内核时钟值的情况下,校准之后的时钟频率的计算公式都会有所不同,因此需要注意。的一个周期的开始,如果是输出时钟的话,那就对应这输出时钟信号的一个边缘,相对应的经过了从平滑数字校准功能模块输送给异步预分频功能模块的128个。
2023-10-30 16:17:46 188
原创 纠错码(Error correction code,ECC)中的汉明码,NAND FLASH中的纠错码(第二部分)
的比特位是两个比特位中的高位(比特7和比特6中的比特7,比特5和比特4中的比特5,比特3和比特2中的比特3,比特1和比特0中的比特1),计算。的比特位是8个比特位中的高4位(比特7,比特6,比特5,比特4,比特3,比特2,比特1和比特0中的比特7和比特6,比特5和比特4)。的比特位是四个比特位中的高2位(比特7,比特6,比特5和比特4中的比特7和比特6,比特3,比特2,比特1和比特0中的比特3和比特2),计算。(这里针对的是512字节的数据块)就可以确定出错的那个比特位所在的位置,比特位所在的位置可以用。
2023-03-26 10:09:08 805 1
原创 纠错码(Error correction code,ECC)中的汉明码,NAND FLASH中的纠错码(第一部分)
纠错码是一种用在不可靠的或者噪音比较大的通信信道中用来控制数据传输错误的技术。这种技术的核心思想是数据的发送方对将要发送的数据进行编码,使得编码之后的数据不仅包含了原有要发送的数据,还包含了一部分额外的冗余数据,接收方可以利用这部分冗余数据检测接收到的数据是否发生了错误,如果发生了错误,还可以利用这部分冗余数据来对部分发生错误的数据进行校正。这样就有可能避免数据的重传,这对于重传代价比较大的应用领域是非常友好的。通常情况下编码过程中引入的冗余信息越多,可以监测和校正的数据位越多,但是同时也意味着传输的有效数
2023-03-19 15:42:53 2401
原创 第四章:架构,Architecture
The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors
2022-07-15 16:35:22 573
原创 第一章:ARM公司Cortex-M 系列处理器介绍,第二章:嵌入式软件开发介绍和第三章:Cortex-M3和Cortex-M4处理器的一般介绍
The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors
2022-07-13 16:44:40 738
原创 第七章:异常和中断(Exceptions and Interrupts)
The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors
2022-07-06 17:41:18 450
原创 学习笔记:Chapter 8,Exception Handling in Detail+HardFault 异常分析
The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors
2022-07-02 15:35:41 318 1
原创 ARM单片机上的C语言库<setjmp.h>的使用
在看别人的ARMARMARM单片机的程序的时候,看见了对setjmpsetjmpsetjmp的调用,跳转过去之后发现还是库的内容,我以前也没有碰见过,于是这在这里记录以下。 要调用setjmpsetjmpsetjmp只要把头文件setjmp.hsetjmp.hsetjmp.h包含进来就可以了,我这边看到的是这个头文件位于KEILKEILKEIL的安装目录,如图1所示。这个应该也是CCC语言
2022-03-16 17:55:08 1484
stm32 H750 QSPI flash indirect write and read.
2022-09-25
Specification of Time Synchronization over CAN
2022-06-12
CIA 603 introduction:Time-stamping of CAN frames
2022-06-12
FFTDemo.rar
2020-07-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人