• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : ARM用户模式怎么修改协处理器? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 28950
精华: 0
发帖: 21
金钱: 110 两
威望: 22 点
综合积分: 42 分
注册时间: 2010-09-19
最后登录: 2011-11-15
楼主  发表于: 2010-12-10 20:26

 ARM用户模式怎么修改协处理器?

管理提醒: 本帖被 kasim 从 开发板硬件讨论区 移动到本区(2010-12-12)
在用户模式下好像不能修改协处理器,内联会汇编时,程序运行,应该是在用户模式下,这样要修改协处理器要怎么做呢?
比如S3C2440设置时钟,有:
//如果HDIVN非0,
//CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode”
if (hDivnVal != 0)
{
  uint reg=0;

  __asm
  {
   mrc    p15, 0, reg, c1, c0, 0        //读出控制寄存器  
   orr    reg, reg, #0xC0000000          //设置为“asynchronous bus mode”
   mcr    p15, 0, reg, c1, c0, 0        //写入控制寄存器
  }
可是,这样修改不了协处理器,会产生未定义异常,
这种情况应该怎么做啊?
我用MDK!
级别: 新手上路
UID: 31907
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
综合积分: 18 分
注册时间: 2010-11-07
最后登录: 2011-01-03
1楼  发表于: 2010-12-11 21:33
本部分内容设定了隐藏,需要回复后才能看到
[ 此帖被吕氏春秋8266在2010-12-11 21:38重新编辑 ]
初次学习,请多关照
级别: 新手上路
UID: 28950
精华: 0
发帖: 21
金钱: 110 两
威望: 22 点
综合积分: 42 分
注册时间: 2010-09-19
最后登录: 2011-11-15
2楼  发表于: 2010-12-12 00:53
咋地还隐藏啊
级别: 新手上路
UID: 28950
精华: 0
发帖: 21
金钱: 110 两
威望: 22 点
综合积分: 42 分
注册时间: 2010-09-19
最后登录: 2011-11-15
3楼  发表于: 2010-12-12 00:54

 回 1楼(吕氏春秋8266) 的帖子

呵呵,看到了,我试了,用swi中断切到中断,然后在中断里设置,可是。。。可是。。。不行啊!
级别: 新手上路
UID: 28950
精华: 0
发帖: 21
金钱: 110 两
威望: 22 点
综合积分: 42 分
注册时间: 2010-09-19
最后登录: 2011-11-15
4楼  发表于: 2010-12-12 00:56
这样:
    //如果HDIVN非0,
    //CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode”
    if (hDivnVal != 0)
    {
        __asm
        {
            swi        0
        }
    }

然后这样:
SWI_Handler    
                stmdb    sp!, {r0-r3,lr}            ;现场保护
                mrc    p15, 0, r0, c1, c0, 0        ;读出控制寄存器  
                orr    r4, r4, #0xC0000000          ;设置为“asynchronous bus mode”
                mcr    p15, 0, r0, c1, c0, 0        ;写入控制寄存器
                ldmia    sp!,{r0-r3,pc}^            ;现场恢复

真是没折了!!!
级别: 新手上路
UID: 31907
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
综合积分: 18 分
注册时间: 2010-11-07
最后登录: 2011-01-03
5楼  发表于: 2010-12-12 08:22
你看看软中断是在什么模式下,在软中断处理中将其切换到系统模式下,改变总线类型后,再切换到为软中断所在模式再返回
初次学习,请多关照
级别: 新手上路
UID: 28950
精华: 0
发帖: 21
金钱: 110 两
威望: 22 点
综合积分: 42 分
注册时间: 2010-09-19
最后登录: 2011-11-15
6楼  发表于: 2010-12-12 09:45
======
级别: 新手上路
UID: 28950
精华: 0
发帖: 21
金钱: 110 两
威望: 22 点
综合积分: 42 分
注册时间: 2010-09-19
最后登录: 2011-11-15
7楼  发表于: 2010-12-12 09:47

 回 5楼(吕氏春秋8266) 的帖子

===============================
swi是管理模式,也试过,
swi中断后,我切到系统模式,修改p15,
然后回到管理模式
最后也over了,
你有设置过时钟吗,你是怎么做的?
===============================
级别: 新手上路
UID: 31907
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
综合积分: 18 分
注册时间: 2010-11-07
最后登录: 2011-01-03
8楼  发表于: 2010-12-12 10:00
我是直接在初始化代码中设置的,代码如下:
AREA Init,CODE,READONLY
    ENTRY
    GET S3C2440.INC
    IMPORT _TestMain
    IMPORT IRQ_Handle
    b Start
    nop
    nop
    nop
    nop
    nop
    b IRQ_Handle
    nop
Start
    ldr    r0,=WTCON       ;watch dog disable
    ldr    r1,=0x0
    str    r1,[r0]
    
    mrc p15,0,r0,c1,c0,0        ;将CPU总线模式从fast bus mode 改为asynchronous bus mode ,
                                 ;如在fast bus mode下,HDIVN非0,则CPU频率为HCLK,而不是FCLK
     orr r0 ,r0,#0xc000000       ;R1_nF:OR:R1_iA  ;R1_nF:OR:R1_iA=0xc000000
     mcr p15,0,r0,c1,c0,0
    


     ldr r0,=LOCKTIME            ;设置LOCK频率改变时的锁定时间,使用默认值。
     ldr r1,=0xfffffff
     str r1,[r0]
    
     ldr r0,=MPLLCON             ;设置FCLK时钟其中MDIV[19:12]=0x5c,PDIV[9:4]=0x1,SDIV[1:0]=0x1    
    
                                 ;FCLK=(2*(MDIV+8)*Fin)/((PDIV+2)*2^SIDV) Fin=12Mhz FCLK=400Mhz
     ldr r1,=(0x5c<<12+0x1<<4+0x1)
     str r1,[r0]
    
     ldr r0,=CLKDIVN             ;设置FCLK/HCLK/PCLK比例,其中1:4:8  FCLK=400Mhz HCLK=100Mhz PCLK=50Mhz
     ldr r1,=(0x2<<1+0x1)              
     str r1,[r0]

    ldr    r0,=INTMSK
    ldr    r1,=0xffffffff  ;all interrupt disable
    str    r1,[r0]

    ldr    r0,=SUBINTMSK
    ldr    r1,=0x7fff        ;all sub interrupt disable
    str    r1,[r0]
    
    msr cpsr_c,#0xd2    ;设置中断模式堆栈指针
    ldr sp,=4096
        
    msr cpsr_c,#0xdf    ;系统模式并关闭IQR中断
    ldr sp,=3072
    
    ;初始化存储控制器寄存器,使SDRAM可用
    adrl r0,MEMDAT
    ldr r1,=BWSCON
    add r2,r0,#52
0
    ldr r3,[r0],#4
    str r3,[r1],#4
    cmp r2,r0
    bne %b0    
    
    b _TestMain
    
MEMDAT DATA
    DCD 0x22121110
    DCD 0x7ff4
    DCD 0x2e50
    DCD 0x2e50
    DCD 0x2e50
    DCD 0x2e50
    DCD 0x2e50
    DCD 0x18005
    DCD 0x18005
    DCD 0x9404f4
    DCD 0x32
    DCD 0x30
    DCD 0x30
        
    end
初次学习,请多关照
级别: 新手上路
UID: 31907
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
综合积分: 18 分
注册时间: 2010-11-07
最后登录: 2011-01-03
9楼  发表于: 2010-12-12 10:01
mrc    p15, 0, r0, c1, c0, 0        ;读出控制寄存器  
orr    r4, r4, #0xC0000000          ;设置为“asynchronous bus mode”
mcr    p15, 0, r0, c1, c0, 0
仔细看了一个,你用R0或R4,不对吧
初次学习,请多关照
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go