通常我们定义全局变量的做法都是在.C文件里面定义全局变量,然后在这个文件对应的头文件里面加 extern 声明,在外部文件调用的时候,包含其头文件,加入全局变量的声明(不加也是可以的,最好加上,包含
.h文件的时候已经把声明加入了)
//test.c
int a;
//test.h
extern int a;
//main.c
#inc……继续阅读 »
gql
4年前 (2021-04-23) 1118浏览
#include,它可以将一个文件的全部内容拷贝另一个文件中。那如果这个包含的文件出错,可能报错的就不在这个文件中。
这里有一个CMainApp.cpp文件,他包含了三个头文件,分别是CMainApp.h,aaa.h,CMcuFlash.h。
#include "CMainApp.h"
#include "aaa.h"……继续阅读 »
gql
4年前 (2021-04-23) 1160浏览
编译过程可以分为四个阶段:
预处理(-E)
预处理就是对源程序中的伪指令(以#开头的指令)和特殊符号进行处理的过程。伪指令包含宏定义指令,条件编译指令和头文件包含指令。gcc对C源文件进行预处理后会输出 .i 文件。
主要处理规则如下:
(1)将所有#define删除,并且展开所有的宏定义。(预处理指令1 – 宏定义!)
(2)处理所有条件编译指……继续阅读 »
gql
4年前 (2021-04-23) 1134浏览
int func(uint32 x){
int countx = 0;
while( x )
{
countx ++;
x = x&(x-1);
}
return countx;
……继续阅读 »
gql
4年前 (2021-04-08) 923浏览
使用arm-none-eabi-gcc (Sourcery G++ Lite For AMR)编译STM32的C++程序后的.ld .map文件的理解
以stm32f030rct6为例,在stm32f0_stm32f030xc.ld,有如下一段脚本。
/* Entry Point */
ENTRY(Reset_Handler)
/* Highest ……继续阅读 »
gql
4年前 (2021-04-01) 1142浏览
在Coretext-M3与Coretext-M4核中,在System Control Block中存在一个向量表偏移量寄存器 VTOR(0xE000ED08),系统产生中断后,内核通过这个寄存器的值来找到中断向量表的地址,进而执行中断例程代码,当然,此寄存器的值是可以修改的,它的默认值为0,由于映射关系,实际上就是指向映射地址,比如0x0800 0000。值……继续阅读 »
gql
4年前 (2021-04-01) 1026浏览