【ARM】Tiny4412裸板编程之异常(软中断)
生活随笔
收集整理的這篇文章主要介紹了
【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:nop04. 設置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 SCTLRcp15.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, lr05. 程序示例一
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:nopstart.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 = 0x006. 程序示例二
輸出中斷號和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:noptest.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 = 0x007. 附錄
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裸板编程之异常
- 下一篇: 【IT资讯】继哈工大Matlab软件被美