我改动了RTC中的内容系统就起不来了?
我目前用的是6410+wince6的平台,我改动了RTC中的内容,之前用的是CPU的RTC,目前我们加了一个外部的RTC,我通过iic对它进行读和写。
问题1:如果采用我在驱动中的iic驱动,通过deviceiocontrol的时候单独编译RTC的时候可以编译的过去。但是如果使用编译选项build current bsp的时候就出错了,调试信息显示好像是找不到deviceiocontrol的库。手动加进去也不行,不知道为什么?
问题2:用上面的方面不行了,我便采用了通过gpio模拟了iic但是用的还是iic的那俩个脚,在读写之前,先把这俩个脚设置成普通io口。在读写完之后再设置成iic的sda和scl,这样编译成功后,系统却启动不了了,打印串口消息如下:
Windows CE Kernel for ARM (Thumb Enabled) Built on Sep 30 2007 at 22:37:06
[OAL] S3C6410_APLL_CLK : 532000000
[OAL] ARMCLK : 532000000
[OAL] HCLK : 133000000
[OAL] PCLK : 66500000
[OAL] ++InitializeDisplay()
[OAL] --InitializeDisplay()
[OAL] InitializeGPIO()
DCache: 128 sets, 4 ways, 32 line size, 16384 size
ICache: 128 sets, 4 ways, 32 line size, 16384 size
Arguments area has some values. Do not Initialize
-OALArgsInit()
+OALTimerInit( 1, 33250, 0 )
-OALIntrRequestSysIntr(irq = 38, sysIntr = 16)
++IIC_Open()
--IIC_Open()
Exception 'Data Abort' (4): Thread-Id=00410002(pth=8dfdf024), Proc-Id=00400002(pprc=82531308) 'NK.EXE', VM-active=00400002(pprc=82531308) 'NK.EXE'
PC=8013e584(NK.EXE+0x0003e584) RA=8013e57c(NK.EXE+0x0003e57c) SP=d001fd5c, BVA=00000007
Exception 'Prefetch Abort' (3): Thread-Id=00410002(pth=8dfdf024), Proc-Id=00400002(pprc=82531308) 'NK.EXE', VM-active=00400002(pprc=82531308) 'NK.EXE'
PC=00000000(???+0x00000000) RA=8015fb90(kernel.dll+0x00006b90) SP=d001fb88, BVA=00000000
Exception 'Prefetch Abort' (3): Thread-Id=00410002(pth=8dfdf024), Proc-Id=00400002(pprc=82531308) 'NK.EXE', VM-active=00400002(pprc=82531308) 'NK.EXE'
PC=00000000(???+0x00000000) RA=8015fb90(kernel.dll+0x00006b90) SP=d001f9b4, BVA=00000000
Exception 'Prefetch Abort' (3): Thread-Id=00410002(pth=8dfdf024), Proc-Id=00400002(pprc=82531308) 'NK.EXE', VM-active=00400002(pprc=82531308) 'NK.EXE'
PC=00000000(???+0x00000000) RA=8015fb90(kernel.dll+0x00006b90) SP=d001f7e0, BVA=00000000
Exception 'Prefetch Abort' (3): Thread-Id=00410002(pth=8dfdf024), Proc-Id=00400002(pprc=82531308) 'NK.EXE', VM-active=00400002(pprc=82531308) 'NK.EXE'
PC=00000000(???+0x00000000) RA=8015fb90(kernel.dll+0x00006b90) SP=d001f60c, BVA=00000000
Exception 'Prefetch Abort' (3): Thread-Id=00410002(pth=8dfdf024), Proc-Id=00400002(pprc=82531308) 'NK.EXE', VM-active=00400002(pprc=82531308) 'NK.EXE'
PC=00000000(???+0x00000000) RA=8015fb90(kernel.dll+0x00006b90) SP=d001f438, BVA=00000000
..........,下面基本上是重复了
最后是BVA=1000001b, dwInfo = 00000001
R0=ffffc800 R1=fffd34f8 R2=fffd3570 R3=10000003
R4=8015a638 R5=00000000 R6=8016088c R7=82533704
R8=fffd34f8 R9=00000000 R10=fffd3570 R11=8016088c
R12=00000000 SP=fffd34c0 Lr=80160a78 Psr=80000113
Exception
希望大牛们给解答
[解决办法]
估计是你实现上有问题。你改RTC,是直接在OAL的代码中改的吗?
建议不直接修改那个地方,而是另外写一个驱动,在系统启动时获取到准确时间后写入到MCU的RTC中,
系统运行过程中还是用MCU内部的RTC控制器。
[解决办法]
问题1:RTC是在OAL中初始化的,在oal中调用不了驱动的,因为此时设备管理器还没运行呢。
问题2:wince使用的是虚拟地址,在使用IO的寄存器时,必须先对虚拟地址和物理地址进行映射。请问楼主映射了吗?
[解决办法]
++IIC_Open()
--IIC_Open()
Exception 'Data Abort' (4): Thread-Id=00410002(pth=8dfdf024), Proc-Id=00400002(pprc=82531308) 'NK.EXE', VM-active=00400002(pprc=82531308) 'NK.EXE'
#######################################
看信息,异常是在执行完IIC_Open()后出现的。应该是IIC_Open()这个函数引起的。
可能1:IIC_Open()中设置RTC错了,或者RTC根本就不工作了,导致NK引用时间出现异常。
可能2:IIC_Open()中执行了什么非法操作,一步一步排除咯
[解决办法]
1.在XXX_Init中实现上面所说的功能就可以了。虽然是在OAL执行完成之后,但没有任何影响。就好像你进入系统后也可以修改系统时间一样。
2.让你的RTC保持工作是硬件需要做的事情吧?跟软件没有关系。
3.OAL中实现IIC读取RTC,实现上不是很方便。即使实现了,由于系统会一直读取RTC,如果不是读取MCU内部的RTC,就会导致频繁操作IIC,感觉不太好。
我的思路是外部的RTC作为基准,每次开机时读取其中的值,并同步到MCU内部的RTC上,系统运行时直接用MCU内部的RTC控制器就可以。
[解决办法]
这个应该在oal里面实现,setoemtime()函数里面实现它,通过读写寄存器或者io口的方法来实现。这属于接近硬件部分的代码了。
[解决办法]
系统起不来,应该跟换芯片没有关系,估计是你指针用错了
或者是如果你在oal里面改东西,要注意了,即使不在一个文件中,也不能有同名函数,因为最后它们要连到一个库中,因此可以仔细查查有没有同名的函数,我以前被这个问题绊倒过