chenguozi 发表于 2009-3-28 00:33:30

移植uCOSII体会(二)

今天得到了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的跑马灯。虽然可以实现但是总觉得不太好。希望大家
指点一下
staticvoidAppTaskLed (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);                        
                        }
      }
               
      }         

   
}
staticvoidAppTaskLed2 (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);               
                        }
      }

      }
   
}
 

lulidpj 发表于 2009-5-15 16:10:52

信号量多用于任务间同步,和互斥.
邮箱用于大数据的传送.
队列多用于处理有序的事件.



信号量就是中央Z.F.发给官人做一方大员的官印,有很多种官印但是不能一印多发,得到官印者才能掌权鱼肉一方百姓(任务得到信号量才能运行),否则你就只要等官跑官。
   邮箱,就好给比当差的下达的抄家、拆房、收监等红头文件,拿到啥样的文件就干啥。
   消息队列,就是给任务发了一连串的邮件,官员(任务)拿到这一大摞文件,可以从底部或者顶部(LIFO or FIFO)一个一个拆开处理。

0620223 发表于 2009-10-24 09:23:44

ddddddddd

qzf368 发表于 2009-11-5 23:55:00

1楼正解

deep_55 发表于 2009-12-16 22:32:54

做个记号~~~~~~~~

mawenwei 发表于 2009-12-16 23:24:15

来看抄家的

csformat 发表于 2009-12-18 07:50:21

1楼说话很河蟹

顶了,又长知识又解气!!

myworkmail 发表于 2010-1-8 15:47:23

mark

blueliuyun 发表于 2010-4-27 11:11:21

回复【1楼】lulidpj
信号量多用于任务间同步,和互斥.
邮箱用于大数据的传送.
队列多用于处理有序的事件.

信号量就是中央Z.F.发给官人做一方大员的官印,有很多种官印但是不能一印多发,得到官印者才能掌权鱼肉一方百姓(任务得到信号量才能运行),否则你就只要等官跑官。
   邮箱,就好给比当差的下达的抄家、拆房、收监等红头文件,拿到啥样的文件就干啥。
   消息队列,就是给任务发了一连串的邮件,官员(任务)拿到这一大摞文件,可以从底部或者顶部(LIFO or FIFO)一个一个拆开处理。

-----------------------------------------------------------------------

说的很好!

shanyao 发表于 2010-6-10 17:02:57

mark

shockstar 发表于 2010-6-19 18:57:02

马克思

liubinghui 发表于 2011-6-16 10:17:26

学习了。

iirf 发表于 2011-6-17 08:42:51

mark!!

kenny17 发表于 2011-6-17 09:47:13

又受教了

monkhooder 发表于 2011-6-17 10:10:45

我是顶一楼的解释的,一语中的,讲的非常好

gccsky 发表于 2011-7-9 05:02:41

mark

lovelywwei 发表于 2011-7-12 18:12:12

MARK先。学习学习

jsls135 发表于 2011-7-14 12:22:44

回复【楼主位】chenguozi
-----------------------------------------------------------------------

我喜欢这种风格,易懂,风趣
页: [1]
查看完整版本: 移植uCOSII体会(二)