嵌入式工程师常用知识点总结附答案,呕心沥血篇,绝对实用

C基础相关的知识点总结

搞嵌入式软件开发,c基础要打捞。基础不牢,搞到最后,地动山摇。---------共勉

FAQ:

  • static全局变量和普通全局变量的区别?static局部变量和普通局部变量的区别?static函数和普通函数的区别?
    answer: 回答这个问题之前,首先要知道局部变量是存在栈中的,全局变量是存在静态区的,动态申请的数据(指针)是存在堆中的。OK,下面从作用域和存储方式这两方面回答这个问题。
    static全局变量只初始化一次,只能被该文件中的函数调用,防止其他文件(稍微复杂点的项目,功能都是模块化,分几个文件)引用,全局变量改变为静态全局变量只是改变了其作用域,存储方式没有发生变化。普通局部变量是存在栈中的,每次调用重新赋值;static局部变量则存储在静态区,只初始化一次,下一次依据上一次的结果值,故static局部变量存储方式发生了变化,同时改变了生命周期。static函数在内存中只有一份,只能在当前定义的源文件中使用;对于可在除当前文件可调用的普通函数,应该在头文件中声明,要是用改函数的其他文件只需要包含其头文件即可,也仅仅是改变了作用域。

  • 高级语言编译的主要步骤
    answer: 编译主要经过4个步骤:预处理->编译->汇编->链接。

    预处理就是将.c文件编程.i文件;编译将.i文件编程.s文件,汇编.s变成.o文件,链接是将.o文件需要的关联到一块

.c变成.i
.i成.s
.s成.o
预处理cpp
编译器ccl
汇编器as
链接器ld
执行文件bin
  • const char * p, char const * p, char * const p 上述三者有什么区别?**
    经验总结:const 在 * 的左侧表示修饰的是常量变量,变量声明时,必须初始化,且变量的值不可修改;const在*的右侧时,表示修饰的是指针常量,指针不能在指向别的变量,但指向变量的值可以改变。
    char name[20] = "asdf";
	char age[20] = "66";
	char *const p = name;//指针常量
	//p = age;//错误,指针常量已经指向name了,不能在修改成指向别的
	p[0] = 's';//正确修改name[0]的值

**赠品:**指针常量和常量指针速记的小诀窍:从左往右念( char *const p
就是指针常量)

  • 写一个标准宏,输入2个参数,并返回较小的那个数。
    #define min(x,y) (x) > (y) ?(y):(x)
    注:要熟练运用三元运算符,代码中老出现if else,真的好low…共勉。

自己对面向对象编程的思考:

  • 面向对象的编程原则:“高内聚,低耦合”;面向对象时侧重于“高内聚”,面向接口编程时侧重于“低耦合”。
  • 开闭原则:只能通过扩展的方式,而不是更改已有的代码来适应需求的变化。对扩展开放,对修改关闭。
  • 依赖倒置原则:应用层模块不应该依赖底层模块,应该依赖抽象。抽象不应依赖细节,细节应该依赖抽象。模块间的依赖是通过抽象实现的,具体的实现之间不发生直接的依赖关系,依赖关系通过接口或者抽象产生。(依赖倒置原则是控制反转和依赖注入的基础,是实现开闭原则的途径)。

思考:单片机的底层驱动,怎么可以做到代码复用,易于功能扩展,且移植芯片时,不影响已经存在的应用层接口?

answer: 采用一切皆文件的设计思想,同等对待gpio口,led等,lcd液晶等外设驱动。它们在编程时,都体现为唯一的两个字节id标识的文件名,这样完成和其他模块之间数据交换的工作,可以屏蔽模块间的耦合性,统一设备模型,应用层可以隔离驱动层。

== 底层驱动接口统一的好处 ==

-[] 统一的设备驱动模型确保了程序容易移植到新的mcu上;统一的设备驱动模型接口,应用层无需关系文件对应的设备差异,无需关心文件的access pattern(寻址、搜索、校验、备份方式)等差异。

-[] 采用文件名预分配机制,避免了手动管理存储地址。编程时,面向的是文件名,而不是绝对的物理地址或具体的设备。

  • 驱动编程时,分为3层:MCU层,HAL层,BSP层。

MCU层:包括硬件驱动程序及厂家给的库文件,MCU层的驱动测试完成后,不可以随意更改;

HAL层:硬件抽象层,直接与硬件平台相关,包括I0设备驱动、中断源、时钟源、低功耗和睡眠等管理,为扳级层提供相应的驱动接口,可以是8,16,32位的处理器。硬件抽象层隐藏了特定平台的硬件接口细节,提供虚拟的硬件设备驱动服务接口。

板极驱动层:完成MCU以外的其他硬件设备的初始化,因为软件架构下版级驱动程序大多与MCU无关,除了少许配置的不同,适用于任何类型的单片机运行。

你可能感兴趣的:(嵌入式ARM和C)