
嵌入式C语言
文章平均质量分 88
嵌入式C语言
进击的横打
此人不懒,但也什么都没有写
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
IEEE802.3中的CRC32算法
发送端:发送端根据信息字段与生成多项式生成一个CRC码,CRC码作为数据发送给接收端,同时也会把计算出的校验字段的数据一同发送(注:目的是如果接受端检测到发送的数据是正确的,接收端能够从CRC码中提取出信息字段的数据)。接收端:接收到CRC码数据后,检测接收到的数据是否正确,方法:将CRC码数据与生成多项式进行模2除,如果余数为0,则说明接收到的数据是正确的。然后,从CRC码中提取出信息字段的数据。处理完所有字节后,将最终得到的CRC寄存器中的值进行异或操作,即可得到最终的CRC32校验和。原创 2024-07-30 20:54:28 · 2336 阅读 · 0 评论 -
嵌入式C语言--Pragma Section与Map文件
map文件是软件编译后产生的有关所有程序、数据及IO空间的一种映射文件。通过map文件可以知道函数大小,入口地址等一些重要信息。Map文件可以理解成为它就是程序的地图。使用section关键字可以将我们指定的结构体或变量放入到我们自定义的输入段中同时函数也可以放到我们自定义的输入段当中。原创 2024-06-04 21:48:58 · 620 阅读 · 0 评论 -
C语言中的#pragma预处理指令
pragma用于指示编译器完成一些特定的动作#pragma所定义的很多指示字是编译器特有的(后面的参数决定)#pragma在不同的编译器间是不可移植的预处理器将忽略它不认识的#pragma指令不同编译器可能以不同的方式解释同一条 #pragma指令。原创 2023-12-20 08:29:14 · 2874 阅读 · 0 评论 -
嵌入式C语言中的关键字volatile
由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器;调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令。原创 2023-12-06 08:09:22 · 1678 阅读 · 0 评论 -
嵌入式C语言的固定地址操作
(void))0x8000的意思是把0x8000转成函数指针,那么程序可以调准到0x8000。3) p指向a,对p赋值就是对a里面的值赋值,也就是对a里面的指针形式的0xf0100000赋值,也就是对0xf0100000地址出赋值。在进行嵌入式开发的时候,由于需要和底层的存储设备比如DDR,flash,sd卡等打交道,所以会经常遇到需要读写特定内存地址的问题。如果要让程序跳转到指定绝对地址去执行,可以通过将绝对地址强转为函数指针的方法。)(void)是函数指针,((void (原创 2023-12-11 08:11:10 · 946 阅读 · 0 评论 -
Big-endian与Little-endian详尽说明
字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序。在几乎所有的机器上,多字节对象都被存储为连续的字节序列。不同的CPU有不同的字节序类型,最常见的有两种:Little-Endian:将低序字节存储在起始地址(低位编址),也就是小端存储模式。Big-Endian:将高序字节存储在起始地址(高位编址),也就是下面说的大端存储模式。数据的低位保存在内存中的高地址中,数据的高位保存在内存中的低地址中;原创 2023-12-29 08:02:59 · 1856 阅读 · 0 评论 -
嵌入式C语言--WatchDog最全概念
Watchdog,又称watchdog timer,它是计算机可靠性(dependability)领域中一个极为简单同时非常有效的检测(detection)工具。WatchDog硬件的逻辑就是,其硬件上有个记录超时功能,然后要求用户需要每隔一段时间(此时间可以根据自己需求而配置)去对其进行一定操作,比如往里面写一些固定的值,俗称“喂狗”,发现超时了,即过了这么长时间还不给狗喂食,那么偶就认为你系统是死机了,出问题了,狗狗就帮你重启系统。原创 2024-01-04 19:00:07 · 1523 阅读 · 0 评论 -
嵌入式C语言--ROMRAM相关概念(RO-data、RW-data、ZI-data的解释)
一个程序包含三个部分,RO段,RW段和ZI段。RO是程序中的指令和常量RW是程序中的已初始化变量ZI是程序中的未初始化的变量映像文件包含了RO和RW数据,但不包含ZI数据。是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。只有单片机的实际Flash容量大于等于程序编译后的Total ROM Size值,且单片机的实际RAM容量大于等于编译后的Total RW Size值,程序才能在单片机中正常运行。原创 2024-01-06 23:04:25 · 3247 阅读 · 0 评论 -
嵌入式C语言--LD文件的概念
LD组合了许多对象文件和归档文件,重新定位它们的数据并绑定符号引用。通常编译程序的最后一步是运行LD。LD(Linker)文件是一个负责将目标文件和库文件链接成可执行文件或共享库的程序。每个可加载或可分配的输出section都有两个地址。第一个是VMA,即虚拟内存地址。这是运行输出文件时该节所拥有的地址。第二个是LMA,即加载内存地址。在大多数情况下,这两个地址将是相同的。原创 2024-01-20 16:30:12 · 3097 阅读 · 0 评论 -
嵌入式C语言--pragma ghs section的运用
具体来说,VC链接器在链接的过程中,会将各编译单元中的section按照name的从小到大顺序排列,name的比较规则遵循strcmp的字符串比较逻辑。gcc/g++编译器会自动生成分区的起始和结束边界,只需要extern引入边界变量即可,具体生成的边界变量名可能因编译器版本的区别有差异,需要自行通过链接器查看确认。但是,可通过使用 #pragma ghs section,使链接器能够删除本来可能会保留的函数或变量,因为它与使用的函数或变量位于相同的节中。此编译指示指定要用于后续函数或对象的节名称。原创 2024-01-28 17:17:12 · 2706 阅读 · 1 评论 -
嵌入式C语言--#pragma指令
pragma用于指示编译器完成一些特定的动作#pragma所定义的很多指示字是编译器特有的(后面的参数决定)#pragma在不同的编译器间是不可移植的预处理器将忽略它不认识的#pragma指令不同编译器可能以不同的方式解释同一条 #pragma指令。原创 2024-01-28 17:50:50 · 1860 阅读 · 0 评论 -
嵌入式C语言--中断服务程序
2类中断优先级比1类低。所谓中断是指当CPU正在处理某件事情的时候,外部发生的某一事件(如一个电平的变化,一个脉冲的发生或定时器计数溢出等)请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事件。ISR完成后程序返回被打断处继续执行,即中断对任务管理没有影响,这里的没有影响指的是不会引起新的任务调度,比如,任务A被一类中断打断后,一类中断运行完后从任务A被打断的位置继续执行,不会去执行任务B。存放在内存中的一个数组,内容是中断服务函数的地址们(数组下标与中断优先级对应,也称中断向量)。原创 2024-03-16 11:36:42 · 2887 阅读 · 0 评论 -
嵌入式C语言--GPT通用定时器
GPT根据计时模式可以分为Continuous及One-Shot模式,其中Continuous在开始计时达到设定时间后会自动开始下一轮计时,但对于One-Shot模式则需要调用API Gpt_Startimer()重新开始定时。GPT即General Purpose Timer(s) ,通用定时器模块,该模块通过使用硬件定时器通道为操作系统或其他需要定时器功能的模块提供定时功能,通常可提供从微秒级到毫秒级的定时时钟功能。4)当不需要再继续定时调用Gpt_Stoptimer(),关闭定时器,停止计时。原创 2024-03-31 16:20:31 · 1462 阅读 · 0 评论 -
嵌入式C语言--Map文件
用于存储函数的局部变量,以及各种函数调用时需要存储的信息(比如函数返回的存储器地址、函数状态等),每一次的函数调用就会在栈上建立一个 stack frame(栈帧),存储该次调用的所有数据于状态,这样以来同一个函数被调用多次时,就会有不同栈帧,不会相互干扰。初始化数据区段(initialized data segment)存储已经初始化的静态变量,例如有经过初始化的C语言的全局变量(global variables)以及静态变量(static variables),分为RW-data和RO-data。原创 2024-05-05 17:14:12 · 2226 阅读 · 0 评论 -
嵌入式C语言--基础知识
并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度strlen只能测量字符串 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。在函数调用结束时,不对该变量的内存进行释放,值仍然保留。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy,由于字符串是以“¥0”结尾的,所以对于在数据中包含“¥0”的数据只能用memcpy。宏替换则是在预编译时进行的,在展开时不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。原创 2024-05-27 10:47:57 · 635 阅读 · 0 评论