日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【ARM】Tiny4412裸板编程之异常(软中断)

發布時間:2024/4/24 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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裸板编程之异常(软中断)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。