解决CCS5.5 调试DM8168过程中,无法配置部分寄存器

如何解决上述问题?初步设想增加 ARM权限(即Supervisor模式),是否能够解决上述问题。

一、解决方案

具体步骤如下:

1、编写启动文件super_startup.asm

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
01.;**  
02.; \file super_startup.asm  
03.;  
04.; \brief Firmware startup for supervisor mode  
05.;  
06.; @author mansoor.ahamed@ti.com  
07.;  
08.;/  
09.  
10.  
11.  
12.    .sect   ".text"  
13.    .state32  
14.    .global mystartup  
15.    .global _c_int00  
16.  
17.mystartup:  
18.    ldr pc, RTS_JUMP ;Jump to rtslib _c_int00 but skip 4 instructions   
19.                     ;which puts cpu in user mode   
20.       
21.  
22.RTS_JUMP        .long   (_c_int00 + 0x10)  
23.      
24.    .end 


    编写完成后,将启动文件添加到工程文件中

2、设置CCS编译器,指定super_startup.asm 第一个启动文件。

在工程文件处右击选择Properties:

设置完成后,点击OK即可。这样就完成,跳过boot.asm中将系统模式修改用户模式。

2、工作机制

在super_startup.asm中跳转到 地址:(_c_int00 + 0x10)处,该处的地址有在哪里呢? 标号_c_int00在boot.asm中定义。

具体详见下面。

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
01.***************************************************************  
02.;* DEFINE THE USER MODE STACK (DEFAULT SIZE IS 512)  
03.;***************************************************************  
04.__stack:.usect  ".stack", 0, 4  
05.  
06.        .global _c_int00  
07.;***************************************************************  
08.;* FUNCTION DEF: _c_int00  
09.;***************************************************************  
10._c_int00: .asmfunc  
11.  
12.        .if __TI_NEON_SUPPORT__ | __TI_VFP_SUPPORT__  
13.        ;*------------------------------------------------------  
14.        ;* SETUP PRIVILEGED AND USER MODE ACCESS TO COPROCESSORS  
15.        ;* 10 AND 11, REQUIRED TO ENABLE NEON/VFP  
16.        ;* COPROCESSOR ACCESS CONTROL REG  
17.        ;* BITS [23:22] - CP11, [21:20] - CP10  
18.        ;* SET TO 0b11 TO ENABLE USER AND PRIV MODE ACCESS  
19.        ;*------------------------------------------------------  
20.        MRC      p15,#0x0,r0,c1,c0,#2  
21.        MOV      r3,#0xf00000  
22.        ORR      r0,r0,r3  
23.        MCR      p15,#0x0,r0,c1,c0,#2  
24.  
25.        ;*------------------------------------------------------  
26.        ; SET THE EN BIT, FPEXC[30] TO ENABLE NEON AND VFP  
27.        ;*------------------------------------------------------  
28.        MOV      r0,#0x40000000  
29.        FMXR     FPEXC,r0  
30.        .endif  
31.  
32.        ;*------------------------------------------------------  
33.        ;* SET TO USER MODE  调试需要 屏蔽该段代码   hailin  
34.        ;*------------------------------------------------------  
35.        MRS     r0, cpsr  
36.        BIC     r0, r0, #0x1F  ; CLEAR MODES  
37.        ORR     r0, r0, #0x10  ; SET USER MODE  
38.;        ORR     r0, r0, #0x1F  ; SET SYS MODE  
39.        MSR     cpsr_cf, r0  
40.  
41.        ;*------------------------------------------------------  
42.        ;* INITIALIZE THE USER MODE STACK  
43.        ;*------------------------------------------------------  
44.        .if __TI_AVOID_EMBEDDED_CONSTANTS  
45.        MOVW    sp, __stack  
46.        MOVT    sp, __stack  
47.        MOVW    r0, __STACK_SIZE  
48.        MOVT    r0, __STACK_SIZE  
49.        .else  
50.        LDR     sp, c_stack  
51.        LDR     r0, c_STACK_SIZE  
52.        .endif  
53.        ADD     sp, sp, r0 

二、疑问点

2.1 地址(_c_int00 + 0x10)在哪里?

首先明确ARM指令长度概念,A8支持两种指令集:

a. 32bits (ARM状态)

b.16bits (Thumb状态)

注:如何确定使用何种指令集?通过查询CPSR[5]状态判断,当CPSR[5]=1,使用Thumb 或 Thumb EE指令集;当CPSR[5]=0,使用ARM指令集。具体详见下图

 

A8架构的CPSR描述                                 

在CCS5.5中,用户程序成功加载后,读取CPSR[5]时为0,表示使用ARM指令集。

2.2 为什么跳转(_c_int00 + 0x10)处?

跳转到:(_c_int00 + 0x10),实际上跳过 标号_c_int00后 4条指令(ARM指令集中每条指令占用4个byte),即跳过协处理器设置,导致usr模式无法设置。

永不止步步 发表于11-07 10:42 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:345327个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号