weiqi7777

cortex-a8裸机系列:第六章 看门狗及c语言环境设置

0
阅读(2171)

一、            关闭看门狗

S5PV210在上电运行的时候,开门狗是默认打开的,如果不将看门狗给关掉的话,或者是不喂狗,那时间到了后,就会将CPU复位。

因此,在上电后,是要将看门狗关掉的。

 

看门狗框图

clip_image002

本质上是一个定时器,可以产生中断信号,也可以产生复位信号。

使用的是PCLK时钟。通过WTCON寄存器控制。

WNCNT是一个16位的计数器。当计数满足一定条件的情况后,会产生中断信号,或者复位信号。

CPU启动后,CPU默认看门狗是开启的,所以需要关闭。不过在210的内部的IROM中,其实已经关闭看门狗了。

 

看门狗定时时间。和PCLK时钟,预分频值和除法系数有关。

clip_image004

 

在调试模式下,看门狗是不工作的。

 

四个寄存器

clip_image006

 

1.    WTCON

看门狗控制器

clip_image008

要使用看门狗进行复位,要将WTCON[0](控制看门狗是否产生复位信号)和WTCON[5](控制看门狗计数是否开启)都置为1.

WTCON[2]是控制看门狗是否产生中断。

2.    WTDAT

数据寄存器,保存的是看门狗计数器的重载值。当作为普通计时器的时候,计数溢出后,WNCNT计数器会载入这个寄存器的值,再进行计数。

如果写入的值是0x8000WNCNT会立马载入这个寄存器的值。也就是所谓的喂狗。

clip_image010

3.    WNCNT

看门狗计数器的计数值,看门狗是一个递减的计数器,每个时刻计数的值就保存在WNCNT寄存器中,如果这个寄存器的值为0,那么就会产生中断信号,或者复位信号。

clip_image012

4.    WTCLRINT

看门狗计数器中断寄存器

clip_image014

往这个寄存器写入任何值,清除看门狗定时器产生的普通中断。在中断服务程序中需要往这个寄存器中写入值,以清除中断。

二、            C语言运行环境设置

c语言运行环境的设置,其实就是设置栈顶。

C语言与栈的关系:C语言中的局部变量都是用栈来实现的。如果我们汇编部分没有给C部分预先设置合理合法的栈地址,那么C代码中定义的局部变量就会不正确,就很可能会引发程序错误。

编译器(gcc)在链接的时候会帮我们自动添加一个头,这个头就是一段引导我们的程序能够执行的一段汇编实现的代码,这个代码中帮我们的C程序设置了栈和其他的运行时需要。

设置SVC模式下的栈

1.         设置模式为SVC模式

2.         操作SP

栈是当前一段可用的内存(可用的意思是这个地方必须有初始化过可以访问的内存,而且这个内存只会被用作栈,不会被其他程序使用)

CPU被复位(刚启动),外部的DRAM尚未被初始化,目前可用的内存只有内部的SRAM(因为不需要初始化就可以使用)。因此可以在SRAM中找一段内存作为SVC的栈。

内部SRAM的空间都已经定义好了(IROM初始化的时候定义的),SVC模式下的栈顶设置为0xd003_7d801.5K大小。

  

clip_image016

 

    对于自己编写的裸机代码,链接可能会出现以下错误。

led.o:(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'

对于这个错误,编译的时候需要添加-nostdlib编译选项命令

-nostdlib  不链接系统标准启动文件和标准库文件,只把指定的文件传递给链接器。这个选项常用于编译内核、bootloader等程序,它们不需要启动文件、标准库文件。

C语言程序执行的第一个函数。并不是main函数。生成一个C程序的可执行文件时编译器通常会在我们的代码上加几个被称为启动文件的代码--crt1.ocrti.ocrtend.o等,他们是标准库文件。这些代码设置C程序的堆栈等,然后调用main函数。他们依赖于操作系统,在裸板上无法执行。因此,在编译的时候,就需要告诉编译器,不要将标准库的文件被编译进来。

clip_image018