本文转载自: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就是临时变量,程序运行成功说明栈已经设置好了,更详细的解释将会留到下一章。

tiny4412 裸机程序 三、关闭看门狗和调用C程序【转】的更多相关文章

  1. u-boot分析(五)----I/D cache失效|关闭MMU和cache|关闭看门狗

    u-boot分析(五) 上篇博文我们按照210的启动流程,对u-boot启动中的设置异常向量表,设置SVC模式进行了分析,今天我们继续按照u-boot的启动流程对以下内容进行分析. 今天我们会用到的文 ...

  2. WINCE平台下C#应用程序中使用看门狗

    看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个大数,程序开始运行后看门狗开始倒计数.如果程序运行正常,过一段时间CPU应发出指令让 ...

  3. 软件看门狗--别让你地程序无响应(使用未公开API函数IsHungAppWindow,知识点较全)

    正文一.概述一些重要的程序,必须让它一直跑着:而且还要时时关心它的状态——不能让它出现死锁现象.当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误.我们首要做的事是,把这个Bug揪出来.但如果 ...

  4. Spring Boot 实现看门狗功能 (调用 Shell 脚本)

    需要实现看门狗功能,定时检测另外一个程序是否在运行,使用 crontab 仅可以实现检测程序是否正在运行,无法做到扩展,如:手动重启.程序升级(如果只需要实现自动升级功能可以使用 inotify)等功 ...

  5. bootloader 关闭看门狗

    #define pWTCON 0x53000000disable_watchdog: ldr r0, =pWTCON mov r1, #0x0 str r1, [r0]

  6. Tiny4412之C语言实现流水灯,Tiny4412裸机程序[3]

    在前边我们使用汇编完成了一个流水灯实验: Tiny4412汇编流水灯代码,Tiny4412裸机LED操作 ---- - -- -- -- - -- -- 修改: # ${MKBL2} ${SOURCE ...

  7. Cubieboard2裸机开发之(五)看门狗操作

    前言 说到看门狗,应该不会陌生,看门狗说白了就是一个定时器,但是它有一个非常重要的功能就是复位系统.在A20里,看门狗的操作非常简单,只有两个寄存器,不需要操作时钟相关的东西,系统起来后可以直接使用, ...

  8. Tiny4412中断之看门狗

    一:看门狗(WDT watch dog timer) 看门狗其实是一个计数器,它的作用就是防止程序陷入死循环或者程序运行跑飞:看门狗是一个硬件,它的工作原理是,初始化给他一个值,它会过一段时间减一,直 ...

  9. mini2440裸机试炼之——看门狗中断和复位操作

    看门狗的工作原理: 设本系统程序完整执行一周期的时间是Tp,看门狗的定时周期为Ti,Ti>Tp,在程序正常执行时,定时器就不会溢出,若因为干扰等原因使系统不能在Tp时刻改动定时器的记数值,定时器 ...

随机推荐

  1. HDU_1074_Doing Homework_状态压缩dp

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 Doing Homework Time Limit: 2000/1000 MS (Java/Othe ...

  2. Redis系列(六)--为什么这么快?

    Redis作为一个基于key-value的NoSQL数据库,最显著的特点存取速度非常快,官方说可以达到10W OPS,但是Redis为何这么快? 1.开发语言 Redis使用C语言进行编写的,而Uni ...

  3. 禁止foreach循环使用remove/add----快速失败

    阿里巴巴开发手册中有一条: 7[强制]不要在 foreach 循环里进行元素的 remove / add 操作. remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterato ...

  4. 【原】SMTP发送邮件

    1.下载class.phpmailer.php和class.smtp.php至公共库 2.编写发邮件的公共函数 function sendMail($param) { $config = C('THI ...

  5. 真机测试报错ERROR/AndroidRuntime: java.lang.RuntimeException: setParameters failed解决办法

    这个错误是和调用相机摄像头相关的. 产生这个错误的原因主要在于代码控制分辨率的显示和真机测试分辨率不一样. 一:解决办法 WindowManager wm = (WindowManager) getS ...

  6. Python学习-字符串函数操作3

    字符串函数操作 isprintable():判断一个字符串中所有字符是否都是可打印字符的. 与isspace()函数很相似 如果字符串中的所有字符都是可打印的字符或字符串为空返回 True,否则返回 ...

  7. Linux学习笔记(五) 账号管理

    1.用户与组账号 用户账号:包括实际人员和逻辑性对象(例如应用程序执行特定工作的账号) 每一个用户账号包含一个唯一的用户 ID 和组 ID 标准用户是系统安装过程中自动创建的用户账号,其中除 root ...

  8. OS X中crt中文乱码

    SecureCRT中显示乱码的话,可以去设置为UTF-8编码: Session Options->Terminal->Appearance->Character Encoding,设 ...

  9. Pygame游戏开发入门(1)-开发框架

    pygame库的安装 pip install pygame pygame最小开发框架 #Pygame Hello World Game import pygame,sys #引入pygame和sys( ...

  10. 洛谷 3398 仓鼠找sugar 【模板】判断树上两链有交

    [题解] 题意就是判断树上两条链是否有交.口诀是“判有交,此链有彼祖”.即其中一条链的端点的Lca在另一条链上. 我们设两条链的端点的Lca中深度较大的为L2,对L2与另一条链的两个端点分别求Lca, ...