国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

Qsys與uCOS學習筆記3:Hello uC/OS-II

發布時間:2016-1-28 10:02    發布者:designapp
關鍵詞: Qsys , uCOS
  uC/OS-II(又名Micro C/OS)是基于嵌入式系統的完整的,可移植、可固化、可裁剪的可剝奪型實時內核,其已經廣泛應用在航空飛行器、醫療設備、工業控制等可靠性和穩定性要求較高的場合。該內核的代碼也是完全開源的,如果不做商業用途,完全免費。因此對于廣大的嵌入式愛好者與工程師們而言,了解OS從uC/OS-II開始不失為一個很好的選擇。
  之前是使用特權同學自己的SF-NIOS2開發套件進行了EDS上的uC/OS-II樣板工程測試,為了當前學習筆記的持續性,這里重新就DE2-115板重新整理一個Hello uC/OS-II實例的創建和演示。
  Qsys組件添加
  在一個工程實例基礎上,添加一個Interval Timer外設,設置該Timer的定時Period為10ms,用于作為uC/OS-II的時鐘節拍(Clock tick),如圖1所示。
  


  圖1
  修改該Timer外設名稱為ucosii_timer。將它的clk和reset信號分別連接到clk組件的clk和clk_reset信號上,將它的Avalon從機接口s1連接到nios_qsys_0的data_master上,并將它的irq連接到nios_qsys_0的d_irq上。
  


  圖2
  自動分配地址,點擊SystemàAssign Base Addresses。自動分配中斷向量號,點擊SystemàAssign Interrupt Numbers,接著點擊Generate生成新的系統。
  完成Qsys新系統的Generate,接著重新編譯Quartus II的project。自此,硬件的修改已經就緒。
  軟件工程創建
  如圖3所示,打開EDS后,點擊FileàNewàNios II Application and BSP from Template新建模板工程。
  


  圖3
  如圖4所示,在新建工程向導中,選擇SOPC Information File name為當前工程目錄下的sopcinfo文件。Project name命名為ucosii_swprj,選擇Project template為Hello MicroC/OS II。最后點擊Finish創建工程。
  


  圖4
  新建工程出現在工程管理窗口后,右鍵單擊ucosii_swprj文件夾,選擇NIOS IIàBSP Editor,如圖5所示。
  


  圖5
  如圖6所示,確定Main頁面中Common里面的stderr/stdin/stdout均為jtag_uart,ucosii_timer為sys_clk_timer即可。點擊Generate更新設置。
  


  圖6
  右鍵點擊應用工程,選擇Build Project進行軟件工程編譯。完成后Console窗口打印如圖7所示的信息,可見這個uC/OS-II內核以及軟件的HAL占用了大約94KB的存儲空間,uC/OS-II其實還是很小的,只不過NIOS II各種外設的HAL比較大,不過也都是可以裁剪的。
  


  圖7
  uC/OS-II運行調試
  首先將Quartus II工程產生的sof硬件配置文件燒錄到FPGA中。
  接著應用工程上點擊右鍵彈出菜單選擇Run asàNios II Hardware,在線運行uC/OS-II實例工程。
  這個uC/OS-II工程的實驗目的只是創建兩個task分別打印一串字符,正如readme所描述:
  Readme - Hello MicroC/OS-II Hello Software Example
  Hello_uosii is a simple hello world program running MicroC/OS-II. The
  purpose of the design is to be a very simple application that just
  demonstrates MicroC/OS-II running on NIOS II. The design doesn't account
  for issues such as checking system call return codes. etc.
  在NIOS II Console中,我們可以看到最終運行的效果,如圖8所示,兩個任務所打印的字符串”Hello from task1”和”Hello from task2”循環出現。
  


  圖8
  主要實例源碼如下:
  #include
  #include "includes.h"
  /* Definition of Task Stacks */
  #define TASK_STACKSIZE 2048
  OS_STK task1_stk[TASK_STACKSIZE];
  OS_STK task2_stk[TASK_STACKSIZE];
  /* Definition of Task Priorities */
  #define TASK1_PRIORITY 1
  #define TASK2_PRIORITY 2
  /* Prints "Hello World" and sleeps for three seconds */
  void task1(void* pdata)
  {
  while (1)
  {
  printf("Hello from task1\n");
  OSTimeDlyHMSM(0, 0, 3, 0);
  }
  }
  /* Prints "Hello World" and sleeps for three seconds */
  void task2(void* pdata)
  {
  while (1)
  {
  printf("Hello from task2\n");
  OSTimeDlyHMSM(0, 0, 3, 0);
  }
  }
  /* The main function creates two task and starts multi-tasking */
  int main(void)
  {
  OSTaskCreateExt(task1,
  NULL,
  (void *)&task1_stk[TASK_STACKSIZE-1],
  TASK1_PRIORITY,
  TASK1_PRIORITY,
  task1_stk,
  TASK_STACKSIZE,
  NULL,
  0);
  OSTaskCreateExt(task2,
  NULL,
  (void *)&task2_stk[TASK_STACKSIZE-1],
  TASK2_PRIORITY,
  TASK2_PRIORITY,
  task2_stk,
  TASK_STACKSIZE,
  NULL,
  0);
  OSStart();
  return 0;
  }
  源碼中,一個標準的uC/OS-II工程,如圖9所示,初始化時調用OSInit();函數;接著調用OSTaskCreate();或OSTaskCreateExt();函數創建用戶任務;最后調用OSStart();函數運行任務。這里的main函數里雖然沒有出現OSInit();函數,但實際上在HAL后臺外設初始化時候肯定調用了。中間是任務的創建,這里創建兩個任務task1和task2,優先級分別為1和2,并且分配了相應的堆棧空間。在兩個任務中,分別打印字符串”Hello from task1”和”Hello from task2”,字符串打印后調用OSTimeDlyHMSM(0, 0, 3, 0);函數做了3s的延時。如果修改這個延時時間,打印效果會發生改變,根據延時的情況,Console窗口出現的打印字樣頻率和速度會不一樣。
  


  圖9
  前面提到我們的實例其實是有OSInit();函數存在的,而且是在系統的main();函數之前就調用了。這里也探個究竟,也算是給大家講講NIOS II的軟件執行順序吧。NIOS II軟件在上電后其實并非如同一幫的裸奔的嵌入式軟件一樣直接從main();函數開始執行程序,而是先執行HAL里面的alt_main();函數,這個函數在bsp工程下的HALàsrc里面,找到名為alt_main();的函數便是。
  


  圖10
  打開alt_main.c源代碼文件后,如圖11所示,alt_main();函數中執行了Qsys系統的幾乎所有可用外設的初始化,因為我們這個模板工程用的是uC/OS-II的例子,所以必有其初始化,圖11中的ALT_OS_INIT();便是。如果右擊該函數,選擇Open Declaration,則我們便能看到這樣的定義:
  #define ALT_OS_INIT() OSInit();
  


  圖11
  再來簡單的熟悉一下這個模板工程中所涉及的幾個函數,包括OSInit();函數、OSTaskCreate();函數、OSTaskCreateExt();函數、OSStart();函數。
  OSInit();函數
  void OSInit (void)
  在使用uC/OS-II的任何功能之前,必須調用該函數。該函數建立了兩個任務:空閑任務——在所有其他任務均未就緒時運行;統計任務——計算CPU的利用率。此外,該函數也對uC/OS-II所有的變量和數據結構進行初始化。
  OSTaskCreate();函數
  INT8U OSTaskCreate (void (*task)(void *p_arg),
  void *p_arg,
  OS_STK *ptos,
  INT8U prio)
  除了OSInit();函數執行時為系統建立的2個基本任務(優先級最低的2個任務),uC/OS-II建議用戶另外保留2個優先級最低的任務和4個優先級最高的任務,為了將來的內核升級只用,當然了,其實也可以不保留。所以,通常來講,用戶至少可以建立56個任務。
  OSTaskCreate();函數有4個入口參數,其含義分別為:task是指向任務代碼的指針;p_arg是任務開始執行時,傳遞給任務的參數的指針;ptos是分配給任務的堆棧的棧頂指針;prio是分配給任務的優先級。
  OSTaskCreateExt();函數
  INT8U OSTaskCreateExt (void (*task)(void *p_arg),
  void *p_arg,
  OS_STK *ptos,
  INT8U prio,
  INT16U id,
  OS_STK *pbos,
  INT32U stk_size,
  void *pext,
  INT16U opt)
  OSTaskCreateExt();函數其實是OSTaskCreate();函數的擴展,前4個參數的定義用法完全一致,后面5個入口參數的定義為:id是為要建立的任務創建一個特殊標志符,主要是保留為了將來內核升級使用,當前只要將此參數值設置成和任務的優先級一樣就行;pbos指向任務堆棧棧底的指針,用于堆棧的檢驗;stk_size用于指定堆棧的容量;pext指向用戶附加的數據域的指針,用來擴展任務的任務控制塊OS_TCB;opt用于設定OSTaskCreateExt();的選項,指定是否允許堆棧的檢驗,是否將堆棧清0,任務是否要進行浮點操作等。
  OSStart();函數
  void OSStart (void)
  該函數負責從任務就緒表中找出用戶建立的優先級最高的任務控制塊,并開始執行這個任務。調用該函數后,軟件就將控制權交給了uC/OS-II的內核,開始運行多任務。在調用該函數之前,必須先建立一個任務,否則,應用程序將會崩潰。
  NIOS II上的uC/OS-II移植,其實就這么簡單。當然了,如果要不斷的深入進去,一定大有學問。
                               
                                                               
                               
               
本文地址:http://m.qingdxww.cn/thread-160470-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Chiptorials——如何使用ATECC608 TrustFLEX實現公鑰輪換
  • Chiptorials ——如何將CryptoAuthLib庫用于Microchip安全身份驗證IC
  • Chiptorials ——使用ATECC608 TrustFLEX實現基本非對稱身份驗證
  • 無線充電基礎知識及應用培訓教程
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: av女同| 精品久久久久久久久久久久久久久 | 日本高清色本在线www | h肉动漫在线观看 | 久久毛片久久毛 | 国产精品三级国语在线看 | 久久九九热re6这里有精品 | 亚洲精品自在在线观看 | 99热精品久久 | 幸福宝草莓视频 | 天堂网视频在线观看 | japan在线观看 | 97一级毛片全部免费播放 | 欧美乱妇高清正版在线观看 | 婷婷色香五月激情综合2020 | 黄网站色年片在线观看 | 久久久久毛片免费观看 | 欧美日韩中文字幕免费不卡 | 免费观看无遮挡www的小视频 | 国产免费私拍一区二区三区 | 日韩欧美视频一区二区在线观看 | 青青草国产免费 | 五月天婷婷色 | 国产在线麻豆一区二区 | 国产精品v一区二区三区 | 视频一区二区三区蜜桃麻豆 | 国产亚洲精品日韩香蕉网 | 国产成人午夜极速观看 | ntr中文字幕亚洲综合 | 亚洲欧美综合日韩字幕v在线 | 国产免费播放 | 久久极品| 自拍视频啪 | 国产日韩欧美一区二区 | 久久这里只精品热免费99 | 久久99热只有视精品6国产 | 欧美大片在线观看完整版 | 国产欧美日韩中文久久 | 国产三级日产三级 | 国产精品日韩欧美一区二区三区 | 色视频免费 |