鷹空獨舞
          邁著慵懶的步子,走在成長路上..... Dead
          posts - 4,comments - 1,trackbacks - 0
               摘要: 在STM32的固件庫和提供的例程中,到處都可以見到assert_param()的使用。如果打開任何一個例程中的stm32f10x_conf.h文件,就可以看到實際上assert_param是一個宏定義;  閱讀全文
          posted @ 2012-05-31 16:53 鷹空獨舞 閱讀(23930) | 評論 (1)編輯 收藏

          OSTaskCreate()
          函數原型:INT8U OSTaskCreate(void(*task)(void *pd),void *pdata,OS_STK *ptos,INT8U prio)
          調用者:任務或者是初始化代碼。
          作用:建立一個新任務,任務的建立可以在多個任務環境啟動之前,也可以在正在運行的任務中建立,中斷處理程序中不能建立任務,一個任務必須為無限循環結構,且不能有返回點。無論用戶程序中是否產生中斷,在初始化任務堆棧時,堆棧的結構必須與處理器中斷后寄存器入棧的順序結構相同。

          該函數返回一個8位的整形數,調用該函數需要四個參數:
          a 第一個參數:task是一個指向任務代碼的指針,也就是用戶代碼的首地址,平常使用中我們把自己創建的任務的名字作為這個參數即可。
          b 第二個參數:pdata指向一個數據結構,該結構用來在建立任務時向任務傳遞參數。
          c 第三個參數:ptos是指向任務堆棧棧頂的指針,一般把創建的任務的堆棧數組首地址賦給它。
          任務堆棧用來保存局部變量,函數參數,返回地址以及任務被中斷時處理器寄存器的內容,任務堆棧的大小決定于任務的需要以及預計的中斷嵌套層數。計算堆棧的大小需要知道任務的局部變量所占的空間,可能產生嵌套調用的函數,及中斷嵌套所需的空間,如果初始化常量OS_STK_GROWTH設為1,堆棧被設為從內存高地址向低地址增長,此時ptos應該指向任務堆棧空間的最高地址,反之,如果OS_STK_GROWTH設為0,堆棧將從內存的低地址向高地址增長。
          d 第四個參數:prio是任務的優先級。每個任務必須有一個唯一的優先級作為標識,數字越小,優先級越高。

          返回值:
          OSTaskCreate()的返回值為下述之一:
          # OS_NO_ERR: 函數調用成功。
          # OS_PRIO_EXIST:具有該優先級的任務已經存在。
          # OS_PRIO_INVALID: 參數指定的優先級大于OS_LOWEST_PRIO
          # OS_NO_MORE_TCB: 系統中沒有OS_TCB可以分配給任務了。

          注意:
          1 任何堆棧必須聲明為OS_STK類型。
          2 在任務中必須調用uCOS提供的下述過程之一:延時等待,任務掛起,等待事件發生(等待信號量,消息郵箱,消息隊列),以便其他任務能得到cpu。
          3 程序中不能使用優先級0,1,2,3,以及OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,OS_LOWEST_PRIO-1,

          OS_LOWEST_PRIO,這些優先級系統保留,其余的56個優先級提供給應用程序。

          范例:
          本例中,傳遞給任務Task1()的參數pdata不使用,所以指針pdata被設為NULLL,注意到程序中設定堆棧向低地址增長,傳遞的棧頂指針為高地址&Task1[1023],如果在你的程序中設定堆棧向高地址增長,則傳遞的棧頂指針應該為&Task1Stk[0]。
          OS_STK Task1Stk[1024];
          void main(void)
          {
          NT8U err;
             ...
          OSInit();//初始化uCOS-II
          ....
          OSTaskCreate(Task1,(void *)0,&Task1Stk[1023],25);
          ...
          OSStart();//啟動多任務環境
          }

          void Task1(void *pdata)
          {
          pdata=pdata;
          for(;;)
          {
          ......   //任務代碼
          }

          }

          posted @ 2012-05-31 16:23 鷹空獨舞 閱讀(502) | 評論 (0)編輯 收藏
          NAND FLASH  與NOR FLASH 的區別

          與Nand Flash對應的是另一種Flash:Nor Flash,其對應的特點是:
          “NorFlash的特點是芯片內執行(XIP,eXecute In Place),這樣應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統RAM中。如uboot中的ro段可以直接在NorFlash上運行,只需要把rw和zi段拷貝到RAM中運行即可。 ”

          而相應地,Nand Flash比較特殊:
          “NandFlash器件使用復雜的I/O口來串行地存取數據,8個引腳用來傳送控制、地址和數據信息。由于時序較為復雜,所以一般CPU最好集成NAND控制器。另外由于NandFlash沒有掛接在地址總線上,所以如果想用NandFlash作為系統的啟動盤,就需要CPU具備特殊的功能,如s3c2410在被選擇為NandFlash啟動方式時會在上電時自動讀取NandFlash的4k數據到地址0的SRAM中。如果CPU不具備這種特殊功能,用戶不能直接運行NandFlash上的代碼,那可以采取其他方式,比如好多使用NandFlash的開發板除了使用NandFlash以外,還用上了一塊小的NorFlash來運行啟動代碼。”

          至于,為什么Nand Flash不能進行XIP的原因,主要是由于物理上的硬件限制,
          在讀取Flash時候,容易出現“位翻轉(bit convert)”:
          “在Flash的位翻轉(一個bit位發生翻轉)現象上,NAND的出現幾率要比NorFlash大得多。這個問題在Flash存儲關鍵文件時是致命的,所以在使用NandFlash時建議同時使用EDC/ECC等校驗算法。 ”

          但是,如果能保證不出錯,也還是可以進行XIP,可以在其上執行代碼的:
          “所謂XIP,就是CODE是在FLASH上直接運行. NANDFLASH只是不適合做XIP,但并不是不能做XIP.
          要一段CODE能夠正確的運行,要保證它的CODE是連續的,正確的.
          由于一些電氣特性的原因,NOR FLASH能夠做到這一點,不存在壞道或壞塊,所以能夠做XIP.
          而對于NAND FLASH, 它只保證它的BLOCK 0是好的,其他的塊并不保證,雖然出錯的幾率比較低,但還是有出錯的可能,所以CODE可能無法連續正確地執行.
          但只要你有額外的保障措施,比如說在執行CODE之前去做一次ECC校驗,來確保CODE是連續正確的.那你也可以做XIP. 事實上我就正在這么做,而且也證明是成功的. ”

          posted @ 2012-05-29 16:46 鷹空獨舞 閱讀(396) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 巩义市| 南宫市| 雷山县| 分宜县| 阿拉善左旗| 开远市| 耒阳市| 华蓥市| 沈阳市| 章丘市| 年辖:市辖区| 抚州市| 曲靖市| 朝阳市| 杭锦旗| 定南县| 涡阳县| 抚州市| 绥宁县| 巨野县| 额尔古纳市| 铜山县| 积石山| 兴文县| 康平县| 康保县| 比如县| 迭部县| 灵山县| 棋牌| 绥宁县| 喀喇| 旬邑县| 宁安市| 新化县| 双流县| 区。| 拜城县| 武强县| 星子县| 永新县|