OMAP138新建工程怎么让ARM进入特权模式啊……不然好多资源操作不了啊,比如管脚复用寄存器
Shine:
下面的网站上有参考代码。http://processors.wiki.ti.com/index.php/OMAP-L138_Bootloader#ARM_Supervisor_vs_User_mode
weihua li:
回复 Shine:
好的,谢谢,已经可以了。
ARM Supervisor vs User mode
By default the TI Code Generation tools for the ARM put the ARM in user mode. This means that certain SYSCFG registers, such as those that control the pinmuxing, cannot be modified by the code. To keep the ARM in supervisor mode, a modified boot.asm file should be included in your ARM project. This file can be found in the following LED blink example project: [3]. In CCS3.3, the "Resolve Symbols to First Library (-priority)" box should be checked in the project linker options to avoid linking errors.
因为缺少了“boot.asm”这个文件,把这个文件添加进来就可以了。
其实可以不用调用CPUSwitchToPrivilegedMode()函数进入了,一调用这个函数就飞了。感谢技术支持……
weihua li:
回复 Shine:
你好,我还行问个问题,就是那些有参考意义的wiki页面是怎么找到的?你给的这个链接我在官网找半天也没发现链接在哪里?
Shine:
回复 weihua li:
wiki网站上有很多有用的资料,在wiki主页面上搜关键字。http://processors.wiki.ti.com/index.php/Main_Page
weihua li:
回复 Shine:
OK,知道怎么找了。谢谢你!
Shine:
回复 weihua li:
客气了~
Tony Tang:
#1. 首先了解一下ARM进入supervisor mode的方法是通过SWI指令.
#2. 参考一下starterware里的代码:
函数:
cpu.c:
void CPUSwitchToPrivilegedMode(void){ asm(" SWI #458752"); }
上面函数的调用会进入SWIHandler, 这里只是做了一个参数的简单比较,当然用户也可以修改这个参数用来实现不同值的传递,达到判断不同条件,从而做不同处理的目的, mode切换就是在下面两条语句实现的。
exceptionhandler.asm:
SWIHandler: STMFD r13!, {r0-r1, r14} ; Save context in SVC stack LDR r0, [r14, #-4] ; R0 points to SWI instruction BIC r0, r0, #MASK_SWI_NUM ; Get the SWI number CMP r0, #458752 MRSEQ r1, spsr ; Copy SPSR ORREQ r1, r1, #0x1F ; Change the mode to System MSREQ spsr_cf, r1 ; Restore SPSR LDMFD r13!, {r0-r1, pc}^ ; Restore registers from IRQ stack
异常向量表的排放在在startup.c里实现的。
static unsigned int const vecTbl[14]={ 0xE59FF018, 0xE59FF018, 0xE59FF018, 0xE59FF018, 0xE59FF014, 0xE24FF008, 0xE59FF010, 0xE59FF010, (unsigned int)Entry, (unsigned int)UndefInstHandler, (unsigned int)SWIHandler, (unsigned int)AbortHandler, (unsigned int)IRQHandler, (unsigned int)FIQHandler};
unsigned int start_boot(void) {
/* Enable write-protection for registers of SYSCFG module. */ SysCfgRegistersLock();
/* Disable write-protection for registers of SYSCFG module. */ SysCfgRegistersUnlock();
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, 0, PSC_MDCTL_NEXT_ENABLE);
PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_AINTC, 0, PSC_MDCTL_NEXT_ENABLE); /* Initialize the vector table with opcodes */ CopyVectorTable();
/* Calling the main */ main();
while(1);}
static void CopyVectorTable(void)
{ unsigned int *dest = (unsigned int *)0xFFFF0000; unsigned int *src = (unsigned int *)vecTbl; unsigned int count;
for(count = 0; count < sizeof(vecTbl)/sizeof(vecTbl[0]); count++) { dest[count] = src[count]; }}
对于ARM,这个异常向量表的地址有两种模式,要么放地址0,要么放地址0xFFFF0000. 在L138的ARM上,为0xFFFF0000.
程序中的中断等,将都进入这个向量表再跳转.
weihua li:
回复 Tony Tang:
感谢你的回答,说的很详细。
http://processors.wiki.ti.com/index.php/StarterWare_01.10.01.01_User_Guide,里面也说
to privileged mode usingCPUSwitchToPrivilegedMode() at any time
所以一开始我是在main函数的地方调用“CPUSwitchToPrivilegedMode”。可是调用这个切换到特权模式的时候就会跑飞,直到Shine Zhang告诉我需要Boot.asm就可以了。然后就发现不用调用这个函数就可以默认进入特权模式了。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
我估计是不是我的工程哪里配置有问题啊,我把cpu.c、startup.c都添加进了工程,代码如下:
void main(void)
{ //ptest = (unsigned int *)0xC0000010; //*ptest = 0xAA55;
CPUSwitchToPrivilegedMode();
PSCModuleControl(SOC_PSC_1_REGS,HW_PSC_GPIO,PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
……
程序就跑飞了????这种方式出现的这个问题现在也不知道为啥。您有啥高见?
weihua li:
回复 weihua li:
exceptionhandler.asm 文件也是加进来的