Exynos 4412 看门狗定时器中断

news2025/1/16 6:50:37

如果想弄懂看门狗定时器中断,要掌握下面两个知识点:

1 懂寄存器

Cortex A9采用的是ARM官方规定的中断处理机制

有两大类寄存器决定了中断工作状态

1) exynos 4412 特有的寄存器(在第26章)

2) Cortex A9 规定的工作寄存器(在第9章和第10章)

2 懂中断处理过程

1) Arm启动先执行一段启动代码(start.S),这段代码是用汇编写的

2) 然后,汇编代码再执行到c的main函数

start.S讲解

.text

.global _start @@@@ _start 是一个全局标号 (表示在其他函数可以调用_start)

_start: @@@@ 通常被指定为0x0000 0000地址

b reset @@@@ 此段代码放在0x0000 0000地址处 ,命令功能是跳转到reset处去执行

ldr pc,_undefined_instruction

ldr pc,_software_interrupt

ldr pc,_prefetch_abort

ldr pc,_data_abort

ldr pc,_not_used

ldr pc,_irq @@@@ 将_irq地址处的指令地址给PC ,相当于一条跳转命令,这条指令回放在0x0000 0018处

ldr pc,_fiq

_undefined_instruction: .word _undefined_instruction

_software_interrupt: .word _software_interrupt

_prefetch_abort: .word _prefetch_abort

_data_abort: .word _data_abort

_not_used: .word _not_used

_irq: .word irq_handler @@@@ .word 是一条伪指令,相当于定义一个4字节的变量_irq,值为irq_handler

@@@@ 等价于 int _irq = irq_handler

_fiq: .word _fiq

@@@@ 伪指令:不是一条实际的汇编指令,变量定义,宏定义,数组定义

reset:

@@@@ 初始化 协处理器

ldr r0,=0x40008000

mcr p15,0,r0,c12,c0,0 @ Vector Base Address Register

@@@@ 设置cpsr的值,为0xd3

mrs r0,cpsr

bic r0,r0,#0x1f

orr r0,r0,#0xd3 @@@@ 0xd3 1101 0011 禁止FIQ, IRQ, 处于ARM状态 ,模式为管理模式 SVC

msr cpsr,r0 @ Enable svc mode of cpu

init_stack: @@@@初始化堆栈, svc, irq, fiq.... 每种模式的堆栈大小为512字节

ldr r0,stacktop /*get stack top pointer*/

/********svc mode stack********/

mov sp,r0

sub r0,#128*4 /*512 byte for irq mode of stack*/

/****irq mode stack**/

msr cpsr,#0xd2

mov sp,r0

sub r0,#128*4 /*512 byte for irq mode of stack*/

/***fiq mode stack***/

msr cpsr,#0xd1

mov sp,r0

sub r0,#0

/***abort mode stack***/

msr cpsr,#0xd7

mov sp,r0

sub r0,#0

/***undefine mode stack***/

msr cpsr,#0xdb

mov sp,r0

sub r0,#0

/*** sys mode and usr mode stack ***/

msr cpsr,#0x10

mov sp,r0 /*1024 byte for user mode of stack*/

@@@此处可以添加自己的初始化代码

b main @@@@ 跳转到main函数,不会回来了

.align 4

/**** swi_interrupt handler ****/

/**** irq_handler ****/

irq_handler: @@@@ 一旦IRQ中断会跳转到这

sub lr,lr,#4

stmfd sp!,{r0-r12,lr} @@@@ 将r0-r12, lr寄存器入栈,,,,保护现场

bl do_irq @@@@ 跳转到中断服务程序do_irq, 执行完再回来

ldmfd sp!,{r0-r12,pc}^ @@@@ 将栈中数据出栈,给r0-r12, lr寄存器,,,,恢复现场

stacktop: .word stack+4*512

.data

stack: .space 4*512

//下面是C代码//

void do_irq(void ) //C语言的中断服务程序代码,这段程序是程序员需要重点完成的

{

int irq_num;

irq_num = (CPU0.ICCIAR & 0x1FF);

switch (irq_num) {

case 58: //turn on LED2; turn off LED3

GPX2.GPX2DAT = 0x1 << 7;

GPX1.GPX1DAT &= ~0x1;

printf("IRQ interrupt !! turn on LED2; turn off LED3\n");

//Clear Pend

EXT_INT41_PEND |= 0x1 << 2;

ICDICPR.ICDICPR1 |= 0x1 << 26;

break;

}

// End of interrupt

CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) | irq_num;

}

int main(void)

{

//.....

}

二:GIC控制器初始化, ARM提供(Generic Interrupt Controller)

4412 的中断控制其部分,采用了ARM公司的GIC中断控制器架构

GIC中断共152个, 分为三部分

SGI 16个 Software Generated Interrupt (SGI)

PPI 8个 Private Peripheral Interrupt (PPI)

SPI 128 Shared Peripheral Interrupt (SPI)

每个中断都被编了一个ID

可以根据GIC Interrupt Table 来查找

SPI Port No SPI中断源编号

ID 总的中断源编号

exynos4412 已经连接了两个外部中断

中断源 SPI Port No ID

EINT[9] 25 57

GIC 设置流程:

1 设置GIC中的某个SPI 中断允许还是禁止

ICDISER(n) ICDISER1, ICDISER2, ICDISER3, ICDISER4

SPI中断共128个,分成了4组

ICDISER1 ---- > 控制 0-31 (第1组) (控制此中断编号是否可以产生中断 1 允许,0 禁止)

ICDISER2 ---- > 控制 32-63 (第2组)

ICDISER3 ---- > 控制 64-95 (第3组)

ICDISER4 ---- > 控制 96-127 (第4组)

INT9 ---- 25号 INT10 ---- 26号

ICDISER1 (GIC的通道号0-31) 如果某一位为1 那么中断允许

允许INT9 产生中断

ICDISER.ICDISER1 |= (0x1 << 25); //中断使能寄存器

允许INT10 产生中断

ICDISER.ICDISER1 |= (0x1 << 26); //中断使能寄存器

练习:

允许WDT产生中断(43)

ICDISER2 |= 0x1 << 11; (43 % 32)

2 设置 某个CPU是否允许响应中断(默认情况,4个CPU都不响应中断)

ICCICR: 对应于每个CPU,都有一个ICCICR,他的功能是 控制这个CPU的总的中断开关,1表示这个CPU响应中断, 0表示不响应中断

CPU0.ICCICR |= 0x1; (把它值1,表明CPU0响应中断)

3 设置 某个CPU响应的中断的高优先级

CPU0.ICCPMR = 0xFF; //上面允许了中断,ICCPMR中断优先级低于设置值的中断允许进入 0xFF高,如果设置成0,

4 设置 中断产生时是否影响中断标志位, 具体中断标志在哪参照ICDICPR

ICDDCR

ICDDCR = 1; //总的中断标志置位允许位

5 设置某个中断是由哪个CPU来响应

ICDIPTR 有很多组:4个中断为1组(中断ID号大159, 160 / 4 = 40, ICDIPTR 有40个 )

如果设置EINT9由CPU0来响应(EINT9 是57号,所以在编号14的寄存器中(56, 57, 58, 59))

ICDIPTR.ICDIPTR14 = 0x00000100; //表示总中断号为 57的中断由CPU0来处理

如果设置EINT9由CPU1来响应

ICDIPTR.ICDIPTR14 = 0x00000200; //表示总中断号为 57的中断由CPU1来处理

如果设置EINT9由CPU2来响应

ICDIPTR.ICDIPTR14 = 0x00000400; //表示总中断号为 57的中断由CPU2来处理

如果设置EINT9由CPU3来响应

ICDIPTR.ICDIPTR14 = 0x00000800; //表示总中断号为 57的中断由CPU3来处理

如果设置EINT9由CPU4来响应

ICDIPTR.ICDIPTR14 = 0x00001000; //表示总中断号为 57的中断由CPU4来处理

//上面的寄存器设置我的中断由哪个CPU来处理

ICDIPTR 有很多(设置某个中断由哪个CPU来执行)

ICDIPTR1 ICDIPTR1 ICDIPTR2 ICDIPTR3 ICDIPTR4 ICDIPTR5........

有 160 / 4 个, 共40个, 每个寄存器控制4个中断

每个寄存器是32位的,8位为1组, 每组代表某种中断由哪个CPU来执行

0000 0001 表示由 CPU0来处理

0000 0010 表示由 CPU1来处理

0000 0100 表示由 CPU2来处理

0000 1000 表示由 CPU3来处理

0001 0000 表示由 CPU4来处理

0010 0000 表示由 CPU5来处理

0100 0000 表示由 CPU6来处理

1000 0000 表示由 CPU7来处理

一个32位寄存器可以分四组

ICDIPTR.ICDIPTR14 = 0x01010101; //编号56,57,58,59四个中断,由CPU0来处理

14 是 总的中断编号 / 4

如果设置EINT9 (57) 中断优先级10

ICDIPR14 = 0x00000A00;

下面是看门狗定时器中断示例

#include

* @brief IRQ Interrupt Service Routine program body

* @param[in] None

* @return None

int flag = 0;

void do_irq(void)

{

int irq_num;

irq_num = (CPU0.ICCIAR & 0x1FF); //获取中断编号

printf("\n ******* WDT interrupt !!********\n");

if(flag == 0)

{

//点亮

flag = 1;

}

else

{

//点灭

flag = 0;

}

//换成点亮或点灭LED3 GPX1_0

WDT.WTCLRINT = 1; //清exynos4412中断标志位

// End of interrupt

CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) | irq_num; //清cpu0中断标志位

}

void wdt_init()

{

WDT.WTCNT = 6000; //initial value ,, 延时大概有两秒

WDT.WTDAT = 6000; //initial value ,, 延时大概有两秒

WDT.WTCON = 0xff<<8 | 1<<5 | 3<<3 | 1<<2 ;

}

void mydelay_ms(int time)

{

int i, j;

while(time--)

{

for (i = 0; i < 5; i++)

for (j = 0; j < 514; j++);

}

}

int main(void)

{

/*

* GIC interrupt controller:

* */

// Enables the corresponding interrupt SPI43, WDT

ICDISER.ICDISER2 |= 1<<11; //ICDISER2:spi 32[bit0] ~ 63[bit31], 43 - 32 = [bit11]

CPU0.ICCICR |= 0x1; //Global enable for signaling of interrupts

CPU0.ICCPMR = 0xFF; //The priority mask level.Priority filter. threshold

ICDDCR = 1; //Bit1: GIC monitors the peripheral interrupt signals and

// forwards pending interrupts to the CPU interfaces2

//ICDIPTR18:SPI40~SPI43; SPI43 interrupts are sent to processor 0

ICDIPTR.ICDIPTR18 = (ICDIPTR.ICDIPTR18 & ~(0xFF<<24)) | 1<<24;

wdt_init();

printf("\n****************WDT Interrupt test!!***************\n");

while(1)

{

mydelay_ms(200);

mydelay_ms(200);

printf("working...\n");

}

return 0;

}

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,

差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。(点击找小助理领取)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/198214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【memcached】下载、安装、、出错一分钟全搞定

各位小伙伴在看黑马程序员springboot的时候可能会遇到的情况&#xff1a;memcached如何安装&#xff1f;官网地址&#xff1a;https://www.runoob.com/memcached/window-install-memcached.html找到合适的下载即可&#xff0c;占用内容很小&#xff0c;几秒就下载好了开启服务安…

SpringBoot + jackson + redis 序列化、反序列化 配置正确姿势

文章目录1.背景2. 原来项目配置3.正确配置4.小结1.背景 最近项目上 使用 SpringBoot 2.7.7 jackson redis 框架实现将javaBean 序列化和反序列化到 redis 中。但是最近在做登陆的时候将LoginUser 序列化到redis 中没问题&#xff0c;不重启服务的话反序列化成对象也没有问题…

【Java多线程】同步代码块处理线程安全问题

题&#xff1a;创建三个窗口卖票&#xff0c;总票数为100张 1.问题&#xff1a;买票过程中&#xff0c;出现了重票&#xff0c;错票 --> 出现了线程的安全问题 2.问题出现的原因&#xff1a;当某个线程操作车票的过程中&#xff0c;尚未操作完成时&#xff0c;其他线程参与进…

IDEA常用技巧汇总

查看代码历史版本鼠标在需要查看的java类 右键 找到Local History >> Show History 点开即可看到历史版本&#xff0c;常用于自己忘记代码改了哪些内容 或需要恢复至某个版本 (注意 只能看近期修改 太久了也是看不到的)idea设置成eclipse的快捷键这对eclipse转idea的开发…

网络编程套接字

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录Socket 套接字UDP 和 TCPUDP数据报套接字编程DatagramSocket APIDatagramPacket APIUdpEchoServerUdpEchoClientUdpDictServer…

分享62个JS返回顶部特效,总有一款适合您

分享62个JS返回顶部特效&#xff0c;总有一款适合您 62个JS返回顶部特效下载链接&#xff1a;https://pan.baidu.com/s/1X1fSwxibtEDXKeYqj0sHXQ?pwde2kp 提取码&#xff1a;e2kp Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj import os im…

[Android]Toolbar

Toolbar是由AndroidX库提供的&#xff0c;它的强大之处在于&#xff0c;它不仅继承了ActionBar的所有功能&#xff0c;并且灵活度很高&#xff0c;可以配合其他控件完成一些Material Design的效果。 使用Toolbar替代ActionBar 在themes的两个xml文件中&#xff0c; 都指定一个…

视频连载08 - 这个为生信学习和生信作图打造的开源R教程真香!!!

点击阅读原文跳转完整教案。1 思考题2 R基础2.1 R安装2.2 Rstudio基础2.2.1 Rstudio版本2.2.2 Rstudio安装2.2.3 Rstudio 使用2.3 R基本语法2.3.1 获取帮助文档&#xff0c;查看命令或函数的使用方法、事例或适用范围2.3.2 R中的变量及其初始化2.3.3 变量类型和转换2.3.4 R中矩…

ECharts接收dataset类型数据封装各类型图形组件

数据平台整合matabase图表&#xff0c;调用matabase已有接口使用echarts实现图表展示 目标 将各类型图形独立封装为组件 将多个组件整体封装成一个组件 使用时只需传入组件名和对应数据即可 展示 数据格式 ECharts中dataset配置 公共组件 示例饼图 pie-chart pie-chart comm…

AcWing 1083. Windy数(数位DP)

AcWing 1083. Windy数&#xff08;数位DP&#xff09;一、问题二、分析状态表示状态转移初末状态循环设计注意事项三、代码一、问题 二、分析 这道题考察的是数位DP的知识&#xff0c;对于数位DP的分析方法作者在之前的文章中做过详细地介绍&#xff1a;AcWing 1081. 度的数量…

java面试题(九)集合篇

2.1 Java中有哪些容器&#xff08;集合类&#xff09;&#xff1f; 参考答案 Java中的集合类主要由Collection和Map这两个接口派生而出&#xff0c;其中Collection接口又派生出三个子接口&#xff0c;分别是Set、List、Queue。所有的Java集合类&#xff0c;都是Set、List、Qu…

【LeetCode】Day206-二叉树着色游戏

题目 1145. 二叉树着色游戏【中等】 题解 官解说的实在是抽象了&#xff0c;看了下高赞题解&#xff0c;果然很清晰易懂 以 x 为根&#xff0c;它的三个邻居&#xff08;左儿子、右儿子和父节点&#xff09;就对应着三棵子树&#xff1a; 左子树右子树父节点子树 哪棵子树…

微服务项目框架及多模块开发

目录 项目模式 技术栈 项目架构图 模块 案例演示 主模块 zmall-common子模块 zmall-user子模块 项目模式 电商模式&#xff1a;市面上有5种常见的电商模式&#xff0c;B2B、B2C、 C2B、 C2C、O2O; 1、B2B模式 B2B (Business to Business)&#xff0c;是指 商家与商家…

java递归-八皇后问题(回溯算法)

1.八皇后问题介绍 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于 1848 年提出&#xff1a;在 88 格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即&#xff1a;任意两个皇后都…

Day04-数据分析模型

文章目录数据分析模型数据分析流程第一&#xff1a;定性法第二&#xff1a;定量法一、数据分析要解决什么问题&#xff1f;1. 研究历史2. 解释现状4. 洞察商机5. 寻求最佳方案二、数据分析师的工作三、数据分析流程1. 数据分析框架2. 数据获取3. 数据处理4. 数据分析5. 撰写报告…

大数据技术架构(组件)18——Hive:FileFormats(1)

1.5、FileFormats1.5.1、FileFormat对比&#xff1a;1.5.1.1、Text File每一行都是一条记录&#xff0c;每行都以换行符&#xff08;\ n&#xff09;结尾。数据不做压缩&#xff0c;磁盘开销大&#xff0c;数据解析开销大。可结合Gzip、Bzip2使用&#xff08;系统自动检查&…

Python 3 基本数据类型,包含示例演示(初学友好)

嗨害大家好鸭~ 我是小熊猫 有好好学习python吗&#xff1f; Python学习资料电子书 点击此处跳转文末名片获取 Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变量…

Redis实现分布式锁

基于Redis实现分布式锁。分为单Redis节点实现和Redis集群实现。 基于单个Redis节点实现分布式锁 作为分布式锁实现过程中的共享存储系统&#xff0c;Redis可以使用键值对来保护锁变量&#xff0c;在接收和处理不同客户端发送的加锁的操作请求。 客户端A、C同时请求加锁&#…

【Linux】基本开发工具的使用-yumvimgcc/g++git

文章目录Linux 软件包管理器-yum什么是软件包window和Linux互传文件的工具: lrzszyum注意事项查看软件包注意事项如何安装软件注意事项如何卸载软件好玩的指令sl 小火车cowsay 打印一只说话的小牛boxes 打印一个ASCII的动画linux_logo 显示linux系统的logocurl http://wttr.in …

2021美赛D题艺术家思路整理

问题整理 使用influence_data数据集或其部分创建音乐影响力的&#xff08;多个&#xff09;定向网络&#xff0c;其中影响者与关注者相连。开发捕捉此网络中“音乐影响的参数”。通过创建定向影响网络的子网络来探索音乐影响力的子集。描述这个子网络。你的“音乐影响”指标在…