如何解决上述问题?初步设想增加 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模式无法设置。