Linux嵌入式编程总结1
1、volatile关键字的用法
volatile是一个特征 修饰符(type specifier). volatile 的作用是作为指令关键字,确保本条指令不会因 编译器的优化而省略,且要求每次直接读值。
volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
大家都应该知道 volatile 主要作用有两点: - 保证变量的内存可见性 - 禁止指令重新排序
2、arm c语言RESERVED1[3]什么作用
这种写法主要用在硬件寄存器的定义,很多 ARM MCU 在设计时,会保留一段(几个至几十上百不等)空间作为将来扩展的功能,或者高档 MCU 阉割为低档 MCU,又需要做到向上兼容,而采取的屏蔽某些功能寄存器的做法。
struct ADC {
uint32_t CTRL;
uint32_t DATA;
uint32_t RESERVED[2]; // 这里有两个 word 的空间保留,可能在高档 MCU 上有实际定义
uint32_t FLAGS;
};
3、makefile的一些总结
target:目标
cc:编译器
LD:连接器
CPP代表"C预处理器"> CXX是一个C编译器> AS是汇编语言编译器> AR是一个存档维护程序
objcopy:复制选项
objdump 反编译选项
INCDIRS:头文件路径
srcdirs:源文件路径
INCLUDE:包含路径
SFILES:源文件
CFILES:复制文件
SFILENDIR;提取源文件名
CFILENDIR;复制文件提取文件
例子:
CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET ?= bsp
CC := $(CROSS_COMPILE)gcc #$(变量名)引用变量
LD:= $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
#整个工程的.h头文件目录,""表示换行符
INCDIRS := imx6ul
bsp/clk
bsp/led
bsp/delay
#整个工程的所有.c和.s文件
SRCDIRS:= project
bsp/clk
bsp/led
bsp/delay
#$(subst ,,)将字符串中的内容替换为
# $(patsubst ,,) 和上面一样但是多了"%".
# $(dir ) 提取目录.如$(dir ) 还回/src.
# $(notdir ) 提取文件名.如$(notdir ) 还回a.c
# $(foreach , ,) 把参数中的单词逐一取出来放到参数中,然后再执行所包含的表达式。
# 每次都会返回一个字符串,循环的过程中,中所包含的每个字符串会以空格隔开,最后当整个循环结束时,
# 所返回的每个字符串所组成的整个字符串将会是函数 foreach 函数的返回值。
INCLUDE:= $(patsubst %, -I %, $(INCDIRS))
SFILES:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
SFILENDIR:= $(notdir $(SFILES))
CFILENDIR:= $(notdir $(CFILES))
SOBJS:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o))#放入obj文件夹
COBJS:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS:= $(SOBJS) $(COBJS)
VPATH:= $(SRCDIRS)
# "="变量的真实值取决于它所引用的变量的最后一次有效值.
#":="不会使用后面定义变量的值.
#"?="若前面没有赋值则现在赋值.若已经赋值则用之前的值.
#"+="追加变量的内容.
.PHONY: clean #伪目标clean. 避免生成文件,规则后面的命令会执行.
$(TARGET).bin : $(OBJS)
$(LD) -Timx6ul.lds -o $(TARGET).elf $^
$(OBJCOPY) -O binary -S $(TARGET).elf $@
$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
#"%"目标中表示对文件名的匹配.或者表示模式规则.
$(SOBJS) : obj/%.o : %.S #所有的.c和.s文件.
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ lt;
#$@表示表示匹配模式中定义的目标集合.
#lt;符合模式的一系列文件集合.
$(COBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ lt;
clean:
rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
#通配符"%"只能用在规则中,只有在规则中它才会展开,如果在变量定义和函数使用时,
#通配符不会自动展开,这个时候就要用到函数 wildcard,$(wildcard *.c) 功能和%一样.
例子二:
led.bin : crt0.S led.c 指的是依赖关系,led.bin是目标文件,:后面是依赖文件
arm-linux-gcc 编译选项 -o 编译及链接,会生成一个exe可执行文件 -Wall 指定产生全部的警告信息 -O/-O2/-O3 数字越高,代表优化的更多,可以使生成的执行文件的提高执行效率 -c 编译不链接,会生成一个*.obj文件,若后面加了-o,则表示指定输出文件名称 -static 静态链接,生成的文件会非常大, 好处在于不需要动态链接库,也可以运行 -S 只激活预处理和编译,就是指把文件编译成为汇编代码
例如:
arm-linux-gcc -c -o led.o led.c :编译不链接
arm-linux-gcc -o led led.c :编译以及链接
arm-linux-ld 连接选项 -Ttext 0x00000000 指代码段头地址为0x00000000 -T链接脚本 指使用链接脚本来进行更复杂的地址设置,包括了代码段,数据段,bss段等 -o 后面指的将多个文件连接在一起,生成一个obj文件,上面的名称是led_elf。 -pie 生成动态链接地址段,一般在新版uboot里会看到
arm-linux-objcopy 复制选项,支持格式转换 -O binary 用来指定生成文件按照后面的格式来输出,其中binary是指生成二进制(.bin)文件。 -S 不从源文件中复制重定位信息和符号信息到目标文件中去
arm-linux-objdump 反编译选项 -D 反编译所有段 -b binary 指定反编译目标文件格式 -m ram 指定反编译目标文件所需的架构,这里是ram架构
4、芯片的时钟晶振
PLL(Phase Locked Loop): 为锁相回路或 锁相环,用来统一整合时钟信号,使高频器件正常工作,如内存的存取资料等。PLL用于振荡器中的反馈技术。 许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。一般的晶振由于工艺与成本原因,做不到很高的频率,而在需要高频应用时,由相应的器件VCO{ 压控振荡器指 输出频率与输入控制电压有对应关系的振荡电路(VCO),频率是输入信号电压的 函数的振荡器VCO,振荡器的工作状态或振荡回路的元件参数受输入控制电压的控制,就可构成一个压控振荡器。voltage-controlled oscillator },实现转成高频,但并不稳定,故利用锁相环路就可以实现稳定且高频的时钟信号。
锁相环路是一种反馈控制电路,简称锁相环(PLL,Phase-Locked Loop)。锁相环的特点是:利用外部输入的参考信号控制环路内部振荡信号的频率和相位。因锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。锁相环通常由鉴相器(PD,Phase Detector)、环路滤波器(LF,Loop Filter)和压控振荡器(VCO,Voltage Controlled Oscillator)三部分组成,锁相环组成的原理框图如图1所示:
锁相环中的鉴相器又称为相位比较器,它的作用是检测输入信号和输出信号的相位差,并将检测出的相位差信号转换成uD(t)电压信号输出,该信号经低通滤波器滤波后形成压控振荡器的控制电压uC(t),对振荡器输出信号的频率实施控制。
专家表示数字经济发展为企业带来新机遇2021中国企业家博鳌论坛中国财富峰会日前在海南博鳌举办。与会嘉宾认为,在数字经济发展大趋势下,要推动数字经济与实体经济融合发展,传统产业需转型升级。企业要抓住数字经济发展新机遇,
中概明天暴跌,我会继续买入周末中概股的消息大家也知道了。滴滴退市,中概股大跌。原因是,美国证监会公布外国公司问责法案的实时细则(SEC),要求美国上市的外国公司提供审计细节和更多所有权机构,如连续三年不满足
原本十分泛滥的山寨手机为什么现在很少见了?当年的山寨手机是质次价低,虽然质量不咋的,但是便宜啊,所以有市场。现在各大品牌手机也是全线开花,高中低档都有,选择面越来越宽,山寨手机的价格优势没了,自然就消失了。大家伙的钱包也越
京东在走下坡路吗?京东会不会走下坡路?这个问题要看京东会不会出现严重的经营问题?我们先看看京东的优势,京东在3c上对比阿里和拼多多,还有苏宁等等等,做的都要好,京东采取的是仓储物流,在京东自营来说,
如果倪光南有能力搞出芯片的,那任正非为什么不去聘他来华为呢?不要通过神话一个专家然后再诋毁他,不要用这种假设的方式捧杀一个院士,你这是高级黑,实质是希望抹杀倪光南院士的贡献,否定倪光南的技术实力,居心不良。芯片的研发需要很强的技术团队,也需
如何抠图换背景?零基础进阶篇,如何抠图换背景详细教程,值得收藏学习利用PS换背景非常简单,并没有你想象的一使用PS就非常难,循环渐进学习最真实的换背景方法,让你爱上PS,爱上摄影。今天教大家如何利
西门子海尔和三星哪个品牌的冰箱更好一些?冰箱这种产品最重要的部件就是压缩机,所以选冰箱就是选压缩机和保鲜技术?西门子以前一直是高端电器的代名词,因罗永浩事件,品牌形象受损严重。虽然事件也暴露了西门子在品控方面出现问题,但
联想杨柳二人最终的结局是什么样的?他们已经走上了历史的审判台,十四亿人民的正义之声,就是人民的审判!社会主义企业也要正衣冠照镜子,好好回头看看自己到底是什么东西,屁股坐到了哪里?要查查,要说说,以保证我们的经济建设
动动手指就能使唤家具!这背后的技术你知道吗?你的居住理想是什么呢?随着智能终端设备以及物联网技术的快速普及,智能家居逐渐走入人们的生活。在北京市朝阳区某智能家居体验中心,一个个智慧家庭样板间让人眼花缭乱。在这里,智能语音家电
市值一年腰斩超过一半!阿里巴巴问题不断,责任在马云还是张勇?文聪明小生校对李蓉婳要说二十一世纪最伟大的发明之一,电商必须要占一个席位,电商的出现,可以说在极大程度上改变了国人的购物方式。相比之下,网购有众多实体店无法比拟的优势,不仅方便快捷
苹果何以重归中国市场第一iPhone13做对了什么?根据最新的CounterpointResearch公司发布的分析报告显示,苹果在2021年10月份超越了中国市场第一名vivo,这是自2015年12月以来,时隔六年,苹果再一次成为