zoukankan      html  css  js  c++  java
  • tiny4412 裸机程序 三、关闭看门狗和调用C程序【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37112779

    一、原理说明

    上是章中大家可能有会觉得奇怪,CPU不是有看门狗嘛?为什么CPU没有复位,程序还能正常工作呢?

    查看Eyxnos4412的手册,第5章简要的说明了其启动顺序,如下图3-1所示是Eyxnos4412启动顺序图,这里虽然没有说的很清楚,但内部iROM和BL1程序中是起一些初始化时钟,DRAM等工作的,其也可能已经使看门狗不工作了。所以上一章程序中,我们也没有人为的关闭看门狗,程序也能正常工作。这一节,我们尝试自己关闭开门狗后再点亮LED灯。

    看门狗的作用在于监控CPU的运行,保证在诸如噪音和系统错误等这样的故障干扰情况下能

    尽快恢复正常工作。看门狗与PWM定时器都能实现定时的功能,两者的区别在于看门狗能发出复位信号而PWM定时器不能,后面将会有具体的章节讲解看门狗的定时和复位功能,这里我们只是简单的将其关闭,然后跳转调用一个C程序。

    图3-1、Exynos4412启动顺序图

    二、程序说明

    完整代码见目录2_led_s_wtd。

    1. start.S

    与代码1_led_s_wtd相比,在代码2_led_s_wtd中,start.S多了两点不一样的地方:

    1)  手动关闭了看门狗,只需往寄存器WTCON写入0即可;

    2)  调用了C函数实现延时的功能,以测试IROM中的固化代码是否设置了栈;

    2. delay.c

    内含一个普通的C语言延时函数,代码如下:

    void delay(int r0)

    {

    volatile int count = r0;

    while (count--);

    }

    汇编调用C函数时,当参数个数不超过4个,使用r0~r3这4个寄存器来传递参数;如果参数个数超过4个,剩余的参数通过栈来传递,delay()只有1个参数,所以用r0来传递。另外,volatile是为了避免编译器自动帮我们优化掉这段代码造成无法延时。 Makefile和sd_fuse里的程序与上一章程序并没有差异,以后若代码与前一个目录的代码相比没有发生变化则将不再赘述。

    三、完整的烧写过程

    已将SD卡插入电脑,假设Linux识别了SD卡,其识别号为sdb。执行下面命令:

    # chmod 777 –R 2_leds_s_wtd 

    # cd 2_leds_s_wtd

    # make

    # cd sd_fuse

    # make

    # ./ fast_fuse /dev/sdb

    四、上电实验

    将SD卡插入到Tiny4412板上子,将启动开关设置拔到SD卡启动端,上电,开机,可以看到4个LED灯正常闪烁,说明手动关闭看门狗成功,同时证明IROM中的固化代码已经设置了栈。为什么程序成功调用C函数就说明了IROM的固化代码设置了栈呢?是因为汇编中调用C函数时,参数的传递、现场的保存和恢复、临时变量的保存等都需要使用到栈,在delay()函数中变量count就是临时变量,程序运行成功说明栈已经设置好了,更详细的解释将会留到下一章。

  • 相关阅读:
    An AODV Tutorial
    MFC去掉单文档的"无标题-"的方法
    win32 openss 编译
    ASP.NET实现RENREN SIG计算
    std::string str.c_str() const
    fopen
    curl with ssl support for win32
    VC++ utf8 Unicode GB2312 编码转换
    编码转换
    VirtualBox uuid冲突问题
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7248845.html
Copyright © 2011-2022 走看看