【ARM】Tiny4412裸板编程之异常(软中断)
00. 目录
文章目录
- 00. 目录
- 01. 开发环境
- 02. 中断向量表
- 03. 中断向量表实现
- 04. 设置Vectors bit
- 05. 程序示例一
- 06. 程序示例二
- 07. 附录
01. 开发环境
- 开发板:Tiny4412SDK标准版 「Tiny4412 SDK 1506」
- 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
- 平台:Ubuntu 20.04
02. 中断向量表
B1.8.1 Exception vectors and the exception base address
03. 中断向量表实现
vector.s文件内容如下
.section .text.align 2.global vector_start
vector_start:b reset @0x0b undef @0x4b swi @0x8b pabort @0xCb dabort @0x10nop @0x14b irq @0x18b firq @0x1Creset:b resetundef:b undefswi:b swipabort:b pabortdabort:b dabortirq:b irqfirq:b firq.align 2.global vector_end
vector_end:nop
04. 设置Vectors bit
B6.1.86 SCTLR, System Control Register, PMSA
访问系统寄存器的方法
MRC p15, 0, <Rt>, c1, c0, 0 ; Read SCTLR into Rt
MCR p15, 0, <Rt>, c1, c0, 0 ; Write Rt to SCTLR
cp15.S增加如下函数
.section .text.align 2.global set_vector_bit
set_vector_bit:mrc p15, 0, r0, c1, c0, 0orr r0, r0, #(1 << 13)mcr p15, 0, r0, c1, c0, 0mov pc, lr
05. 程序示例一
vector.s内容如下
.section .rodata.align 2
.LC0:.string "system call open\n".LC1:.string "cpsr = %p\n"
.LC2:.string "system call num = %d\n".section .text.align 2.global vector_start
vector_start:b reset @0x0b undef @0x4b swi @0x8b pabort @0xCb dabort @0x10nop @0x14b irq @0x18b firq @0x1Creset:b resetundef:b undefswi:stmfd sp!, {r4, lr}ldr r0, .L0mov lr, pcldr pc, .L0 + 4ldmfd sp!, {r4, pc}pabort:b pabortdabort:b dabortirq:b irqfirq:b firq.L0:.word .LC0.word 0x43e11a2c @printf.word .LC1.word .LC2.align 2.global vector_end
vector_end:nop
start.S内容如下
.section .text.align 2.global _start
_start:stmfd sp!, {r4, lr}bl mainldmfd sp!, {r4, pc}.section .text.align 2.global get_cpsr
get_cpsr:mrs r0, cpsrmov pc, lr.section .text.align 2.global system_call_open
system_call_open:stmfd sp!, {lr}swi #2ldmfd sp!, {pc}
test.c内容如下
#include <string.h>
#include <stdlib.h>
#include <adc.h>
#include <gpio.h>void (*udelay)(unsigned int) = (void*)0x43e26480;
int (*print)(const char *format, ...) = (void*)0x43e11a2c;extern unsigned int __bss_start;
extern unsigned int __bss_end;extern void vector_start();
extern void vector_end();//TTB的基地址
U32 *ttb = (void*)0x60000000;
U32 *ttb_c = (void*)0x61000000;int main(void)
{int i = 0;//0x40000000 ~ 0x80000000 1Gmemset((void*)&__bss_start, 0, (int)&__bss_end -(int)&__bss_start);print("main start\n");memset((void*)ttb, 0, 4096 * 4);ttb_l1_init(ttb);ttb_l1_mmap(ttb, 0xffff0000, 0x7fff0000);set_vector_bit();//设置TTB基地址set_ttb(ttb);//设置域访问的权限set_domain(0xffffffff);//使能MMUenable_mmu();//将中断向量表拷贝到0xffff0000地址处memcpy((void*)0xffff0000, (void*)vector_start, vector_end - vector_start);//产生软件中断system_call_open();print("main end\n");return 0;
}
执行结果
## Starting application at 0x50000000 ...
main start
system call open
main end
## Application terminated, rc = 0x0
06. 程序示例二
输出中断号和cpsr的值
vector.s内容如下
.section .rodata.align 2
.LC0:.string "system call open\n"
.LC1:.string "cpsr = %p\n"
.LC2:.string "system call num = %d\n".section .text.align 2.global vector_start
vector_start:b reset @0x0b undef @0x4b swi @0x8b pabort @0xCb dabort @0x10nop @0x14b irq @0x18b firq @0x1Creset:b resetundef:b undefswi:stmfd sp!, {r4, lr}mov r4, lrldr r0, .L0mov lr, pcldr pc, .L0 + 4ldr r0, .L0 + 8mrs r1, cpsrmov lr, pcldr pc, .L0 + 4ldr r0, .L0 + 12sub r4, #4ldr r1, [r4]bic r1, r1, #0xff000000 @获取中断号mov lr, pcldr pc, .L0 + 4ldmfd sp!, {r4, lr}movs pc, lrpabort:b pabortdabort:b dabortirq:b irqfirq:b firq.L0:.word .LC0.word 0x43e11a2c @printf.word .LC1.word .LC2.align 2.global vector_end
vector_end:nop
test.c内容如下
#include <string.h>
#include <stdlib.h>
#include <adc.h>
#include <gpio.h>void (*udelay)(unsigned int) = (void*)0x43e26480;
int (*print)(const char *format, ...) = (void*)0x43e11a2c;extern unsigned int __bss_start;
extern unsigned int __bss_end;extern void vector_start();
extern void vector_end();//TTB的基地址
U32 *ttb = (void*)0x60000000;
U32 *ttb_c = (void*)0x61000000;int main(void)
{int i = 0;//0x40000000 ~ 0x80000000 1Gmemset((void*)&__bss_start, 0, (int)&__bss_end -(int)&__bss_start);print("main start\n");memset((void*)ttb, 0, 4096 * 4);ttb_l1_init(ttb);ttb_l1_mmap(ttb, 0xffff0000, 0x7fff0000);set_vector_bit();//设置TTB基地址set_ttb(ttb);//设置域访问的权限set_domain(0xffffffff);//使能MMUenable_mmu();//将中断向量表拷贝到0xffff0000地址处memcpy((void*)0xffff0000, (void*)vector_start, vector_end - vector_start);//产生软件中断system_call_open();print("main end\n");return 0;
}
执行结果
## Starting application at 0x50000000 ...
main start
system call open
cpsr = 600001d3
system call num = 2
main end
## Application terminated, rc = 0x0
07. 附录
6.1 Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf
6.2 ARM® Architecture Reference Manual ARMv7-A and ARMv7-R edition
【ARM】Tiny4412裸板编程之异常(软中断)相关推荐
- 【ARM】Tiny4412裸板编程之异常
00. 目录 文章目录 00. 目录 01. 开发环境 02. 概述 03. ARM处理器模式 04. 异常类型 05. 异常处理 5.1 异常处理伪代码 5.2 复位异常 5.3 未定义指令异常 5 ...
- 【ARM】Tiny4412裸板编程之异常(中断向量表)
00. 目录 文章目录 00. 目录 01. 开发环境 02. 异常向量表 03. 异常向量表实现 04. 设置Vectors bit 05. 主函数实现 06. 附录 01. 开发环境 开发板:Ti ...
- 【ARM】Tiny4412裸板编程之协处理器
00. 目录 文章目录 00. 目录 01. 开发环境 02. 协处理器简介 03. 获取Main ID 04. 获取CCSIDR 05. 获取SCTLR 06. ID_MMFR3 07. 附录 01 ...
- 【ARM】Tiny4412裸板编程之静态库(libc.a)
00. 目录 文章目录 00. 目录 01. 开发环境 02. 概述 03. 库的来源 04. 程序示例一 05. 程序示例二 06. 附录 01. 开发环境 开发板:Tiny4412SDK标准版 「 ...
- 【ARM】Tiny4412裸板编程之按键(C语言)
00. 目录 文章目录 00. 目录 01. 开发环境 02. 控制原理 03. 配置寄存器 04. 程序示例一 05. 程序示例二 06. 附录 01. 开发环境 开发板:Tiny4412SDK标准 ...
- 【ARM】Tiny4412裸板编程之按键
00. 目录 文章目录 00. 目录 01. 开发环境 02. 控制原理 03. 配置寄存器 04. 程序示例一 05. 程序示例二 06. 附录 01. 开发环境 开发板:Tiny4412SDK标准 ...
- 【ARM】Tiny4412裸板编程之蜂鸣器(C语言)
00. 目录 文章目录 00. 目录 01. 控制原理 02. 配置寄存器 03. 程序示例一 04. 程序示例二 05. 程序示例三 06. 附录 01. 控制原理 咱们的蜂鸣器在底板上,所以需要看 ...
- 【ARM】Tiny4412裸板编程之蜂鸣器
00. 目录 文章目录 00. 目录 01. 控制原理 02. 配置寄存器 03. 程序示例一 04. 程序示例二 05. 程序示例三 06. 附录 01. 控制原理 咱们的蜂鸣器在底板上,所以需要看 ...
- 配置eclipse为ARM嵌入式开发板编程
配置eclipse为ARM嵌入式开发板编程 1-计算机环境 操作系统:window10 编程软件:Eclipse IDE for C and C++ Developers - 2022-09 Wind ...
最新文章
- 【sgTopo】强哥古法炮制、纯手工打造简单拓扑图、流程图、思维导图组件(完善中ing)
- 自然语言不等于英语,为什么NLPer应当认识到这个问题,以及该怎么做?
- 基于java的IO流的文件读取系统
- C#开发中碰到的问题------Uncaught TypeError: Cannot read property 'style' of undefined
- 全世界都在问Java开发凉了吗?意外的惊喜
- 转:Android判断当前网络是否可用--示例代码
- 用Android自带的signapk.jar + .x509.pem + .pk8签名应用程序
- 如何在Spring MVC Test中避免”Circular view path” 异常
- 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(二)ActionSheet视图 学习笔记...
- Last non-zero Digit in N! HDU - 1066
- Spring自定义命名空间
- rtc校准算法_webrtc aecd算法解析一(原理分析)
- 【Jackson】jackson 语法介绍 关键字
- 绝对路径${pageContext.request.contextPath}用法及其与web.xml中Servlet的url-pattern匹配过程...
- android xml 预览,解决Android studio xml界面无法预览问题
- spring-cloud-sleuth 和 分布式链路跟踪系统
- php js 批量打开页面
- 详解Java设计模式之观察者模式(Observer Pattern)
- [转]微服务概念解析
- 安卓调用系统相机进行拍照
热门文章
- 杭电 2036 改革春风吹满地【求多边形面积】
- Processing绘制四边形
- 堆排序(利用最大堆)
- c语言 sdk,适用于 C 语言的 Azure IoT 设备 SDK
- postgresql导入mysql_【原创】MySQL和PostgreSQL 导入数据对比
- rg1 蓝光危害rg0_LED(护眼)台灯|蓝光那些事
- 80m的mysql文件要导入多久_mysql导入数据库文件最大限制更改解决方法:You probably tried to upload too large file...
- MSIL实用指南-比较运算
- Android学习之图片压缩,压缩程度高且失真度小
- Fragment 与 Fragment 相互传值