嵌入式常识大杂烩
处理器、嵌入式C、GDB、异常处理
干锅土鸡
这个作者很懒,什么都没留下…
展开
-
嵌入式开发程序框架
原创 2021-09-26 12:07:51 · 212 阅读 · 0 评论 -
I2C的理解
原创 2021-09-18 23:26:41 · 79 阅读 · 0 评论 -
ESP8266-01S:WIFI模块的具体使用
八脚芯片是Flash,相当于硬盘,存储代码用的。右侧的多脚芯片就是esp8266(主控)具体引脚图:原创 2021-09-18 23:08:42 · 3541 阅读 · 0 评论 -
链表原理和使用
原创 2021-09-16 21:26:11 · 1293 阅读 · 0 评论 -
STM32地址操作相关(二):函数指针
举个STM32 HAL库里的结构体的例子:b被覆盖这里的函数指针,巧妙的一逼!!!好好想想,好好看看!!!原创 2021-09-15 00:36:12 · 1075 阅读 · 0 评论 -
STM32地址操作相关(一)
int a;volatile unsigned int* p;这两行代码会在RAM中分配空间给这两个变量(地址为假设的)变量a、p的地址控制不了,编译器编译链接后最终确定物理地址!原创 2021-09-12 11:23:57 · 224 阅读 · 0 评论 -
项目开发前期设计
原创 2021-07-28 19:17:48 · 104 阅读 · 0 评论 -
系统模块管理的设计
原创 2021-07-28 18:57:34 · 133 阅读 · 0 评论 -
设计,软件质量之本
原创 2021-07-28 18:47:56 · 80 阅读 · 0 评论 -
volatile,让我保持原样
volatile用于修饰一个异变的变量原创 2021-07-28 17:52:05 · 100 阅读 · 0 评论 -
混淆指针与数组带来的问题
做出如下改动:再次编译并运行:结论:指针和数组不是等价的只是看上去是等价的而已原创 2021-07-27 22:23:04 · 84 阅读 · 0 评论 -
缔造程序兼容合约
比如说Windows下的exe文件不能在Linux下运行,因为两者二进制格式不一样为什么这么写就能调用sys_exit这个函数,因为这是Linux规定的ABIsys_exit编号为1ABI:应用程序二进制接口,规范的是二进制API:应用程序编程接口用Qt开发的应用程序,编译出来的可运行程序遵循的ABI是不同的(在不同平台可运行)...原创 2021-07-27 21:25:07 · 77 阅读 · 0 评论 -
深入理解程序的结构
有初始值的变量存入data段没有初始值的变量存入bss段局部变量a、b存在栈中最重要的是代码段:广义上数据段包含:bss data rodata实验:指定入口函数为dt_main,且不使用相关库函数使用objdump查看段信息,可以发现有代码段,没有数据段修改代码:再次objdump -hg_no_value、c_no_value都是4个字节大小,所以bss段有8字节同理data段也是8字节下面将c_no_value改成静态char型:再次objdump -..原创 2021-07-27 02:17:21 · 173 阅读 · 0 评论 -
调试利器GDB
程序运行的参数就是main函数的参数GDB的使用需要可执行文件带调试信息崩溃时产生core文件:运行test.out,会产生core文件倒数第二行,func.c第七行有问题:指向零地址初(野指针),有问题静态分析工具和动态分析工具的差距就看出来了add2line是前者,GDB是后者软件断点适用于内存运行的程序,硬件断点适用于运行再flash中的程序数据断点:监视内存...原创 2021-07-26 23:13:32 · 525 阅读 · 0 评论 -
汇编语言内嵌编程
movl:传值,类似于C语言的赋值操作符,result:%0,input:%1。将input赋给result,打印结果result为1,input还是为1。操作寄存器相当于操作相关联的C语言变量交换a、b变量的值:24行:强制a寄存器关联a变量,b寄存器关联b变量21-23行:交换a、b值的汇编写法,eax:a寄存器,其他类似使用Linux系统调用打印字符串在printf(“main end”)前加入以下代码:并没有打印main end因为这段汇编结束当前进程..原创 2021-07-25 23:16:30 · 187 阅读 · 1 评论 -
链接器
链接目标文件,整合在一起得到可执行程序标识符func相对于代码段的地址g_pointer标识符大小为4字节,C:暂时不知道放在哪一个段g_global在bss段,相对于bss段地址为0(地址不知道)g_test位于data段main位于代码段通过链接后,得到test.out,此时重定位,给段中标识符最终的地址(nm test.out):反编译program.out放到result.txt文件里去:先查找main地址,然后搜索这个地址,发现在_start函数中有这个地.原创 2021-07-25 19:04:07 · 253 阅读 · 0 评论 -
开发中的辅助工具
演示:当前有func.c test.c这里的test.out必须是带调试信息的(gcc -g)此时会出现core文件:接下来用dmesg查看文件内容:会有很多信息,但是只用关注最后ip在访问某一个地址发生错误即可可以看出在调用func.c时出错,错误发生在func.c的第7行可以看出剔除调试信息后,文件大小明显变小很多将.o文件删除后做解压实验:可以看出func文件里有两个标识符func在代码段,还没链接所以地址不知道,00000000代表相对代码...原创 2021-07-25 04:01:13 · 156 阅读 · 0 评论 -
嵌入式C语言编译器
MSIL:微软的中间目标语言方式一方式二相同点不同点方式一:语言到语言方式二:编译得到间接可执行程序(库),(二进制层面的互相兼容)最后链接也可以反过来写:通过映射文件可以找到我们感兴趣的变量/函数的地址,地址在编译结束就决定了,这里的地址是虚存的地址...原创 2021-07-25 02:27:30 · 245 阅读 · 0 评论 -
深入浅出处理器
处理器执行代码时,外设设备通知处理器中断时间到将当前上下文执行信息保存下来,为了处理完中断后可以恢复执行处理器去访问外设,看看发生了什么事,获取中断的类型外设将中断的类型返回到处理器执行ISR(中断服务程序)清除外设设备中断标志位清除自身中断标志位将第二步保存的上下文信息恢复,继续运行本来执行跳转指令,被替换成中断触发指令摩托罗拉产品:内存管理单元程序是静态的概念,二进制数据而已进程是可执行程序运行后的一个动态的概念试验后发现:实模式软件...原创 2021-07-25 00:44:02 · 138 阅读 · 3 评论