硬件与C语言的联系 📅 2026/8/1 3:44:13 由硬件联系C语言由于之前我有一定的C语言基础我这里只是将C语言和硬件联系并不重新学习只是相当于重新复习加深理解程序保存在Flash里各种指令当CPU通电后告诉CPU去读、写某些地址内存暂存内容C语言C程序就是去告诉CPU该怎么去读写内存及各个模块变量定义变量定义大小数据类型且系统分配内存空间分配地址在电路板里用电路电压表示数值1/0所以暂且认为1个晶体管表示1bit的数据不是0就是11byte字节 8bit比特当一个变量的内容超出了分配的大小就只能容纳其低分配大小位的内容有符号的变量最高位是符号位小字节序低位数据存在低地址大字节序低位数据存在高位地址原码、反码和补码原码最高位位符号位0为正数1为负数反码正数的反码原码负数的反码原码除了符号位不变其余位取反补码:正数的补码原码负数的补码反码1内存里存的数据是补码补码的意义就是统一了加法和减法方便了硬件的设置地址指针32位CPU发出32根地址信号给内存控制器内存控制器转发地址信号不一定全部转发可能只转发若干根给外设模块如内存GPIO,UART,Flash等模块这些模块根据地址信号去访问对应的单元用指针访问硬件当指针是内存地址的时候可以对相应地址的内容进行操作同理当指针是其它硬件模块的地址的时候也可以通过写入不同的值来对其状态进行操作但具体的硬件的地址和操作的值要去查关于指针类型的选择当是8位的时候用char *32位的时候用int *比如当都是40021414这个地址时char只能访问这个地址后的8位int则能访问这个地址后的32位字节对齐当数据分配的空间像上面一样排布的时候要去找score时得先根据100找出101、102、103再根据104找出104再进行组合这样cpu效率很低所以要采用字节对齐的方式提高效率对齐的规则1.单个成员成员存放的起始地址必须是这个成员的自身字节数的整数倍空位补填充字节2.嵌套结构体结构体整体当作一个成员是对齐值取它内部最大基本类型的字节3.整个结构体总大小结构体最后的总字节数必须是结构体内最大数据类型字节数的整数倍不够就在尾部填充结构体指针结构体指针指向的是结构体空间的起始空间用结构体指针来操作硬件总结在cpu看来一切都是地址指针举例操作GPIO根据GPIO模块的硬件地址偏移量设计结构体函数指针使用函数的时候实际上是引用它的某个地址我们可以用一个变量的来保存它的地址从而达到一样的效果高级用法1.函数指针作参数调用函数时栈会分配空间这样会直接跳到f所表示的函数地址去执行2.函数指针数组3.结构体中的函数指针3.结构体中的函数指针[外链图片转存中…(img-EHwymfSG-1785503118906)][外链图片转存中…(img-ye7TiOen-1785503118906)][外链图片转存中…(img-eJDzb3mA-1785503118906)]