|
今天得到了dr2001,maxwell_lee metalmax 两位朋友的指点,在此再次表示对他们的感谢!
今天在论坛中看到了“ uc/os为什么不可以在任意地址运行?”这样一个帖子,在此我谈谈我的一些看法
1.正如“dr2001”在给我的回复中提到的“ARMv5开始内核是哈佛的,对外总线地址空间就是统一的,不像51分了各种地址空间”我认为LPC的启动一定是从
Ox0000 0000开始的,但是单一的地址肯定过于简单,因为我们的系统往往有很多不同的存储器件。所以就有了memory re-mapping。重定向用的很多。在
LPC23XX就有专门的寄存器来进行控制,而且LPC23XX启动的时候就吧0x0000 0000重定向到了一个自己的初始化程序,主要用来做ISP等一系列的下载,而且
其中的一下函数还可以进行调用,实现程序运行期间对Flash的读写操作。这点很像我用过的sst的单片机。我想对于arm7的体系结构来说,中断地址,程序
开始地址等都是定死的,但是可以通过scat文件对存储位置的安排,重定向,相应的跳转指令来实习代码在任意位置启动。
2.写了一个用一个信号量两个任务来控制两个led灯一个先亮灭掉后在亮下一个的程序,也就是两个led的跑马灯。虽然可以实现但是总觉得不太好。希望大家
指点一下
static void AppTaskLed (void *p_arg)
{
CPU_INT08U key=1;
CPU_INT08U *msg;
CPU_INT08U err;
CPU_INT32U nstate=0;
p_arg=p_arg;
led_on(1);
led_off(2);
OSTimeDlyHMSM(0, 0, 1, 0);
OSMboxPost(AppUserIFMbox, (void *)key);
OSTimeDlyHMSM(0, 0, 0, 1);
while(1)
{
msg = (CPU_INT08U *)(OSMboxPend(AppUserIFMbox, 0, &err));
nstate= (CPU_INT32U)msg;
if (err == OS_NO_ERR)
{
nstate = (CPU_INT32U)msg;
if(nstate==2)
{
lde_on(1);
lde_off(2);
OSTimeDlyHMSM(0, 0, 1, 0);
OSMboxPost(AppUserIFMbox, (void *)key);
OSTimeDlyHMSM(0, 0, 0, 1);
}
}
}
}
static void AppTaskLed2 (void *p_arg)
{
CPU_INT08U *msg;
CPU_INT08U err;
CPU_INT32U nstate=0;
CPU_INT08U key=2;
p_arg=p_arg;
while(1)
{
msg = (CPU_INT08U *)(OSMboxPend(AppUserIFMbox, 0, &err));
if (err == OS_NO_ERR)
{
nstate = (CPU_INT32U)msg;
if(nstate==1)
{
led_on(2);
led_off(1);
OSTimeDlyHMSM(0, 0, 1, 0);
OSMboxPost(AppUserIFMbox, (void *)key);
OSTimeDlyHMSM(0, 0, 0, 1);
}
}
}
}
|
|