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裸板编程之异常(软中断)相关推荐

  1. 【ARM】Tiny4412裸板编程之异常

    00. 目录 文章目录 00. 目录 01. 开发环境 02. 概述 03. ARM处理器模式 04. 异常类型 05. 异常处理 5.1 异常处理伪代码 5.2 复位异常 5.3 未定义指令异常 5 ...

  2. 【ARM】Tiny4412裸板编程之异常(中断向量表)

    00. 目录 文章目录 00. 目录 01. 开发环境 02. 异常向量表 03. 异常向量表实现 04. 设置Vectors bit 05. 主函数实现 06. 附录 01. 开发环境 开发板:Ti ...

  3. 【ARM】Tiny4412裸板编程之协处理器

    00. 目录 文章目录 00. 目录 01. 开发环境 02. 协处理器简介 03. 获取Main ID 04. 获取CCSIDR 05. 获取SCTLR 06. ID_MMFR3 07. 附录 01 ...

  4. 【ARM】Tiny4412裸板编程之静态库(libc.a)

    00. 目录 文章目录 00. 目录 01. 开发环境 02. 概述 03. 库的来源 04. 程序示例一 05. 程序示例二 06. 附录 01. 开发环境 开发板:Tiny4412SDK标准版 「 ...

  5. 【ARM】Tiny4412裸板编程之按键(C语言)

    00. 目录 文章目录 00. 目录 01. 开发环境 02. 控制原理 03. 配置寄存器 04. 程序示例一 05. 程序示例二 06. 附录 01. 开发环境 开发板:Tiny4412SDK标准 ...

  6. 【ARM】Tiny4412裸板编程之按键

    00. 目录 文章目录 00. 目录 01. 开发环境 02. 控制原理 03. 配置寄存器 04. 程序示例一 05. 程序示例二 06. 附录 01. 开发环境 开发板:Tiny4412SDK标准 ...

  7. 【ARM】Tiny4412裸板编程之蜂鸣器(C语言)

    00. 目录 文章目录 00. 目录 01. 控制原理 02. 配置寄存器 03. 程序示例一 04. 程序示例二 05. 程序示例三 06. 附录 01. 控制原理 咱们的蜂鸣器在底板上,所以需要看 ...

  8. 【ARM】Tiny4412裸板编程之蜂鸣器

    00. 目录 文章目录 00. 目录 01. 控制原理 02. 配置寄存器 03. 程序示例一 04. 程序示例二 05. 程序示例三 06. 附录 01. 控制原理 咱们的蜂鸣器在底板上,所以需要看 ...

  9. 配置eclipse为ARM嵌入式开发板编程

    配置eclipse为ARM嵌入式开发板编程 1-计算机环境 操作系统:window10 编程软件:Eclipse IDE for C and C++ Developers - 2022-09 Wind ...

最新文章

  1. 【sgTopo】强哥古法炮制、纯手工打造简单拓扑图、流程图、思维导图组件(完善中ing)
  2. 自然语言不等于英语,为什么NLPer应当认识到这个问题,以及该怎么做?
  3. 基于java的IO流的文件读取系统
  4. C#开发中碰到的问题------Uncaught TypeError: Cannot read property 'style' of undefined
  5. 全世界都在问Java开发凉了吗?意外的惊喜
  6. 转:Android判断当前网络是否可用--示例代码
  7. 用Android自带的signapk.jar + .x509.pem + .pk8签名应用程序
  8. 如何在Spring MVC Test中避免”Circular view path” 异常
  9. 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(二)ActionSheet视图 学习笔记...
  10. Last non-zero Digit in N! HDU - 1066
  11. Spring自定义命名空间
  12. rtc校准算法_webrtc aecd算法解析一(原理分析)
  13. 【Jackson】jackson 语法介绍 关键字
  14. 绝对路径${pageContext.request.contextPath}用法及其与web.xml中Servlet的url-pattern匹配过程...
  15. android xml 预览,解决Android studio xml界面无法预览问题
  16. spring-cloud-sleuth 和 分布式链路跟踪系统
  17. php js 批量打开页面
  18. 详解Java设计模式之观察者模式(Observer Pattern)
  19. [转]微服务概念解析
  20. 安卓调用系统相机进行拍照

热门文章

  1. 杭电 2036 改革春风吹满地【求多边形面积】
  2. Processing绘制四边形
  3. 堆排序(利用最大堆)
  4. c语言 sdk,适用于 C 语言的 Azure IoT 设备 SDK
  5. postgresql导入mysql_【原创】MySQL和PostgreSQL 导入数据对比
  6. rg1 蓝光危害rg0_LED(护眼)台灯|蓝光那些事
  7. 80m的mysql文件要导入多久_mysql导入数据库文件最大限制更改解决方法:You probably tried to upload too large file...
  8. MSIL实用指南-比较运算
  9. Android学习之图片压缩,压缩程度高且失真度小
  10. Fragment 与 Fragment 相互传值