什么是看门狗?
现实中因为一些外部因素,电子设备经常会跑飞或者死机(譬如极端温度、工业复杂场景)。在这种场景下我们希望设备自动复位而不需要人工干预。看门狗就是完成这个工作的。它其实就是我们Soc内部的一个定时器,(类似于闹钟或者门口的狗)。定好时间之后看门狗定时器会去计时,时间到之前(狗饿了之前)必须去重新置位看门狗定时器(喂狗),如果没有喂狗系统则会强制复位。
系统一般正常工作时,系统软件自己会去喂狗,所以看门狗定时器不会复位,但是系统一旦故障跑飞啥的,看门狗就没人喂了,然后下一个周期就会自动复位,达到我们预期的效果。
类似场景:家门口有一只狗,这个狗定时会饿(譬如说是两个小时一饿),够饿的时候会胡乱咬人,人们进出家门前必须提前喂狗(必须在上次喂狗后的两小时内喂狗才行),防止发生危险(程序跑飞),如果提前喂狗没有关系,但是此次喂狗时间就会从这里开始算。
三星210的开发板由于内部设定需要在功能代码之前进行关看门狗,阿尔法的板子不用;
在上面的代码后面增加 b. led_blink //在此处调用C语言,后面的程序就可以用C语言进行编写了。
汇编代码设置栈和调用C语言
为甚需要设置栈?
因为C语言在运行时,需要一定的运行环境,也就是栈(c语言中需要存局部变量的),这一部分的工作时是需要用汇编程序来做的。
例如:在51单片机中,栈的设置是由硬件进行预留的,在STM32单片机中使用C语言编程时,在启动文件中就做了这一部分的工作,启动文件中就是用汇编写的。
除此之外,不同的模式下我们所设置的栈也不同,基本就是各设置各的,比如内核和应用程序;CPU复位(刚启动)后,系统处于SVC(管理模式),所以此时我们需要设置SVC模式下的栈。此时因为外部内存还没有初始化,所以此时的栈在内部RAM.
void delay(void)//此处对后面的延时函数进行声明;
什么是volatile?
volatile的作用是程序在编译时,编译器不对程序做优化,优化有时候是没有问题的,但有时候会出现一些没办法解决的问题,取决于编译器,如果编译器做了优化则有差异,如果编译器本身没做优化,那就没有差异。
什么是icache?起什么作用?
cache是一种内存,叫高速缓存,
从容量来说:DDR>cache>寄存器>CPU
从速度来说:CPU>寄存器>cache>DDR
因为寄存器与DDR之间的速度相差太大了,所以才会有cache存在,
指令正常执行的过程:指令平常放在硬盘/flash中,当使用的时候,从flash/硬盘中读到DDR,然后从DDR读取到寄存器中,(寄存器与CPU离得最近,假使他们两速度差不多),但是DDR和寄存器速度相差太大,所以有时候读取的速度跟不上CPU处理指令的速度,因此就需要cache的存在(icache工作时,会把CPU正在执行的指令的旁边的指令读取到cache中),当DDR中的指令跟不上CPU处理的速度时,可以从cache中读取,当CPU需要指令时,cache先看看自身有没有这个指令,若有,很方便,直接拿给用,如果没有,则从DDR中去读取,与此同时cache需要删除自身存储,重新缓存。
打开cache 和关闭cache 的流水灯的闪烁现象是不同的:
关闭cache 时,灯的闪烁速度变慢,由此可以验证以上原理!
重定位引入和链接脚本
链接地址:链接时指定的地址(指定方式为:Makefile中用-Ttext,或者链接脚本)
运行地址:程序实际运行时的地址(指定方式:由实际运行时呗加载到内存的哪个位置说了算)
链接脚本的理解:
在编程工作区新建一个文件,在此文件中利用链接脚本的特有格式进行地址声明,在此声明之后,可以在Makefile中的链接语句中,将text之后的地址省略掉。直接用此文件代替。
以上是正点原子阿尔法板链接脚本的写法!