ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

嵌入式工程师面试的一些容易出错的问题

2022-01-28 17:32:24  阅读:155  来源: 互联网

标签:初始化 函数 编译 代码 嵌入式 面试 任务 出错 优化


嵌入式工程师面试的一些容易出错的问题

关于Keil优化等级的特点

优化等级0:近乎不优化,用于调试代码。出现代码行不能设置断点可如此设置试试
特点:最少的优化,可以最大程度上配合产生代码调试信息,可以在任何代码行打断点,特别是死代码处。

优化等级1:移除未调用的内联函数和静态函数,关闭debug窗口优化,此状态也能用于调试
特点:有限的优化,去除无用的inline和无用的static函数、死代码消除等,在影响到调试信息的地方均不进行优化。在适当的代码体积和充分的调试之间平衡,代码编写阶段最常用的优化等级。

优化等级2:默认优化等级。如果处于debug状态,部分代码行将不能被调试
特点:高度优化,调试信息不友好,有可能会修改代码和函数调用执行流程,自动对函数进行内联等。

优化等级3:最大程度优化,产生极少量的调试信息。会进行更多代码优化,例如循环展开,更激进的函数内联等。

参考:https://blog.csdn.net/zhuimeng_ruili/article/details/108208012

Freertos任务调度的原理

代码级任务使用流程:

创建任务:包含任务函数、任务名称、任务堆栈、任务参数、任务优先级、任务句柄

开启任务调度

任务分为运行状态和非运行状态,非运行状态有分为:就绪态、暂停态、阻塞态,运行状态分为挂起的状态

任务调度是通过嘀嗒定时器1ms产生一次超时中断,在系统里面有个任务控制块选择优先级高的,非运行状态(就绪)的任务变成运行状态(挂起),运行1ms后,又轮到下一个任务(就绪)切换

参考:https://blog.csdn.net/pfysw/article/details/80964603

给任务分配了多少内存

首先确定,分配的250不是真的250个字节

任务自身是80个字节作用,再通过临时变量判断任务大小

还可以用freertos的API [uxTaskGetStackHighWaterMark ]读取任务剩余的空间,看到已用空间是多少,在设置已运行任务内存的两倍

还可以用工具:Tracealyzer

常用的通信方法

临界区的作用:多个线程用同一个资源,但是他们又不能同时访问,临界区就可以解决这个问题,比如可以保证printf完整打印数据

互斥量:在一个线程里面

信号量:容许多个线程访问同一个资源,但有限制数目

队列:指令队列长度及元素,分配队列的数据存储空间,可以设置长度及指针

事件:事件用1和0来表示,等待几个同步事件同时满足,多个任务共享事件触发

偏门、不熟的C++/C关键字

volatile:用他修饰的变量防编译器自动优化,影响到编译的阶段,编译无错就行

register:请求编译器尽可能的将变量存放在CPU内部的寄存器中,而不是通过内存寻址访问以提高效率(是尽可能,不是绝对)。其存储速度更快

#program pack:改变编译器的内存对齐方式。

在结构体初始化的时候,比如默认是4个字节对齐,使用它就可以变成2个字节或者1个字节,优化了内存

explicit:关键字的作用就是防止类构造函数的隐式自动转换.

export:使用该关键字可实现模板函数的外部调用。对模板类型,可以在头文件中声明模板类和模板函数;在代码文件中,使用关键字export来定义具体的模板类对象和模板函数;然后在其他用户代码文件中,包含声明头文件后,就可以使用该这些对象和函数。

编译->到可执行文件的流程

预处理->编译->汇编->链接->可执行文件

1.预编译

删除代码中的注释,处理预编译中的头文件最后生成 .i文件。

2.编译

词法分析,语法分析,语义分析,所有符号的汇总 , 代码的优化,最后生成 .s文件。

3.汇编

经行汇编将代码翻译成二进制形式,生成 .o 和.obj文件。

4.链接

1.合并编译后生成的所有***.obj文件的段 调整段长度

合并符号表,解析符号
解析完后就要分配内存地址了,因为每个.o文件的地址之前说了都是独立,可能相同的。你我的偏移量完全可能相同。因此就要分配内存地址,避免冲突

2.符号的重定位最终生成可执行的.exe文件。

关于芯片启动流程

由BOOT1和BOOT1决定从哪个地方启动

初始化sp寄存器和pc寄存器,指向堆栈的指针,及程序计数器

接着会初始化SRAM、划分SRAM的区间,比如:代码区、常量区、堆和栈、静态存储器

初始化中断向量表、

接着进行SystemInit ,开启外部晶振,执行相应的时钟电路

接着进行main函数,进入C语言的编译环境

参考(1):https://www.cnblogs.com/jiangzhaowei/p/9240238.html

参考(2):https://blog.csdn.net/qq_45467083/article/details/103749689

关于Flash使用的空间

Keil有两个地方可获取

1.编译成功后的提示框里面

Program Size: Code=15134 RO-data=466 RW-data=312 ZI-data=29880

Code 是代码占用的空间。

RO-data是 Read Only 只读常量的大小,如const型。

RW-data是(Read Write) RW是可读可写变量,就是初始化时候就已经赋值了的,*\RW + ZI就是你的程序总共使用的RAM字节数。

ZI-data是(Zero Initialize) 没有初始化的可读写变量的大小,就是程序中用到的变量并且被系统初始化为0的变量的字节数,keil编译器默认是把你没有初始化的变量都赋值一个0,这些变量在程序运行时是保存在RAM中的。

2.map里面

将二进制0bj文件链接可执行文件阶段生成的,map文件包含了各个二进制文件组成的构成,里面可以看到每个文件在flash里面的存储位置及大小

定义双向链表的结构体

struct Node{

​ struct Node* First,Next;

​ int a;

}

标签:初始化,函数,编译,代码,嵌入式,面试,任务,出错,优化
来源: https://blog.csdn.net/qq_23940143/article/details/122734214

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有