精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

μCOS代碼移植到了RT-Thread工程筆記

lPCU_elecfans ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-05-25 09:18 ? 次閱讀

公司項(xiàng)目原先使用μCOS-II,但是μCOS存在商業(yè)使用付費(fèi)問題,故而我們轉(zhuǎn)向用國產(chǎn)開源免費(fèi)RTOS RT-Thread替代,花了一天半的時(shí)間將原來的μCOS代碼移植到了RT-Thread上面。下面分移植方法和API對應(yīng)表兩部分講下方法。

一、移植方法

軟件環(huán)境:Win7+MDK5.18.0

硬件環(huán)境:STM32F103

1.從GitHub下載RT-Thread源碼:https://github.com/RT-Thread/rt-thread;

2.將1步驟下載的源碼打開,目錄如下:

其中bsp目錄下面,可以看到很多開發(fā)板工程目錄,如下圖:

項(xiàng)目主控是stm32f1系列的,選擇stm32f10x這個(gè)目錄下的工程作為基礎(chǔ)版本。

3.基礎(chǔ)工程框架下,將我們原有的工程文件添加進(jìn)來,除去μCOS-II相關(guān)源碼。

原來基于μCOS-II的相關(guān)源碼目錄如下:

os_cfg.h:μCOS-II系統(tǒng)相關(guān)的一些宏開關(guān)定義(如是否使能事件、mailbox、信號(hào)量及隊(duì)列等)、系統(tǒng)參數(shù)定義(如每秒tick數(shù)、任務(wù)棧大小定義等),對應(yīng)RT-Thread里面的rtconfig.h

這個(gè)目錄下面是與處理器相關(guān)的代碼,os_cpu_a.asm文件通過Thumb2指令實(shí)現(xiàn)的一些中斷服務(wù)函數(shù)等,例如voidOS_CPU_PendSVHandler(void)處理上下文切換異常等;對應(yīng)到RT-Thread里面的context_rvds.S這個(gè)文件。os_cpu_c.c文件實(shí)現(xiàn)任務(wù)棧初始化和一些鉤子函數(shù)(如空閑任務(wù)和systick等),對應(yīng)到RT-Thread里面的cpuport.c

需要說明的是啟動(dòng)文件context_rvds.S里面定義了兩個(gè)中斷服務(wù)函數(shù)跟stm32f10x_it.c里面是重復(fù)的,分別是HardFault_HandlerPendSV_Handler,移植的時(shí)候需要屏蔽掉stm32f10x_it.c里面相應(yīng)的部分。

這個(gè)目錄下是與處理器無關(guān)的文件,對應(yīng)RT-Thread根目錄下src里面的內(nèi)容。

在移植的時(shí)候,先將以上與μCOS-II相關(guān)的源碼全部刪除,把我們工程其他源碼放在\bsp\stm32f10x\src這個(gè)路徑下,keil工程建立在\bsp\stm32f10x這里。

Keil工程目錄如下:

  • Startup目錄下是stm32和RT-Thread的啟動(dòng)文件,主要是中斷向量表及中斷服務(wù)函數(shù)定義,堆棧和PC指針的相關(guān)初始化。

  • USER目錄下是我們的產(chǎn)品業(yè)務(wù)實(shí)現(xiàn)相關(guān)文件,包括main.c文件。

  • RTT目錄下是RT-Thread源碼,就是RT-Thread根目錄下src里面的內(nèi)容。

4.使用RTT的接口修改掉原來的一些系統(tǒng)調(diào)用,具體如下:

  • 單純地替換接口是比較容易的(詳見后面API對應(yīng)表),只是在移植的過程中需要了解μCOS-II和RT-Thread在工程涉及的部分存在哪些差異,并按照RT-Thread的方式來更新這些地方。例如uart的使用,以及系統(tǒng)的啟動(dòng)過程等。

  • 說明一下uart驅(qū)動(dòng)的移植,涉及到兩個(gè)驅(qū)動(dòng)文件:usart.cserail.c;在serail.c中定義了初始化、打開設(shè)備、數(shù)據(jù)收發(fā)等接口,由于接口中都是動(dòng)態(tài)分配緩存的(rtconfig.h里面可以配置系統(tǒng)是否使用動(dòng)態(tài)分配內(nèi)存,但是關(guān)掉這個(gè)宏之后serail.c中相關(guān)接口會(huì)報(bào)錯(cuò),因?yàn)楹瘮?shù)定義被屏蔽掉了),所以需要打開RT_USING_HEAP這個(gè)宏定義。打開這個(gè)宏之后,我們來看看系統(tǒng)啟動(dòng):

    • startup_stm32f10x_hd.s

      SystemInit()中初始化時(shí)鐘頻率中斷向量表位置等

    • components.c

      rtthread_startup()啟動(dòng)RT-Thread。

    • 詳細(xì)看看rtthread_startup()里面的工作

      rt_hw_board_init()板子初始化工作;rt_show_version()顯示版本信息;rt_system_timer_init()定時(shí)器初始化;rt_system_scheduler_init()任務(wù)調(diào)度器初始化;rt_application_init()用戶自定義的任務(wù);rt_system_timer_thread_init()定時(shí)器線程初始化;rt_thread_idle_init()空閑任務(wù)初始化;rt_system_scheduler_start()開始任務(wù)調(diào)度;

任務(wù)調(diào)度開始之后,OS就啟動(dòng)好了,之后程序都在OS的管理下運(yùn)行了。

  • 接著說uart驅(qū)動(dòng),因?yàn)榇蜷_了RT_USING_HEAP,我們需要對系統(tǒng)堆進(jìn)行初始化:

      rt_system_heap_init((void*)HEAP_BEGIN,(void*)SRAM_END);//其中HEAP_BEGIN為堆起始地址,SRAM_END為結(jié)束地址

根據(jù)自己的MCU進(jìn)行定義:

這樣定義heap范圍應(yīng)將startup_stm32f10x_hd.sheap size改為0。

  • 然后是uart硬件層初始化

  rt_hw_usart_init();//注冊設(shè)備(uart1~uart5)
  rt_console_set_device(RT_CONSOLE_DEVICE_NAME);//使能RT_CONSOLE_DEVICE_NAME//這個(gè)宏定義的uart口打印。
  • 采用輪詢方式發(fā)送,中斷方式接收數(shù)據(jù)

5. 任務(wù)的創(chuàng)建與刪除

RT-Thread的任務(wù)管理分靜態(tài)方法和動(dòng)態(tài)方法,靜態(tài)方法:

只能調(diào)用靜態(tài)方法刪除任務(wù):

動(dòng)態(tài)方法:

只能調(diào)用動(dòng)態(tài)方法刪除任務(wù):

rt_err_t rt_thread_delete(rt_thread_tthread);

其他諸如SPI等驅(qū)動(dòng)及事件、信號(hào)量等處理不再贅述。

二、μCOS-II與RT-Thread API對應(yīng)表:(左側(cè)μCOS-Ⅱ,右側(cè)RT-Thread)

任務(wù)創(chuàng)建與刪除:

OSInit(&err);初始化μC/OS-Ⅱ,對這個(gè)函數(shù)的調(diào)用必須在調(diào)用OSStart()函數(shù)之前。

分動(dòng)態(tài)和靜態(tài)方法,

動(dòng)態(tài)方法:

rt_thread_create();

rt_thread_delete();

靜態(tài)方法:

rt_thread_init();

rt_thread_detach();

OSTaskCreate();

OSTaskDel();

OSStart();真正開始運(yùn)行多任務(wù)。

rt_thread_startup(tid);

任務(wù)掛起與恢復(fù)

OSTaskSuspend();

rt_thread_suspend(tid);

OSTaskResume ();

rt_thread_resume (tid);

操作系統(tǒng)進(jìn)入/退出“臨界區(qū)”的功能代碼:

OS_ENTER_CRITICAL();

rt_enter_critical ();

OS_EXIT_CRITICAL();

rt_exit_critical ();

ENTER ISR

OSIntEnter ();

rt_interrupt_enter();

OSIntExit ();

rt_interrupt_leave();

任務(wù)優(yōu)先級(jí)

μC/OS-Ⅱ和RT-Thread都是值越小優(yōu)先級(jí)越高,但優(yōu)先級(jí)數(shù)不同,μC/OS-Ⅱ支持最多64級(jí),RT-Thread支持最多256級(jí)。

任務(wù)延時(shí):

OSTimeDly();延時(shí)ticks

rt_thread_delay ();延時(shí)ticks

OSTimeDlyHMSM ();延時(shí)(時(shí) 分 秒 毫秒)

事件:

μC/OS-Ⅱ

功能

信號(hào)量

互斥信號(hào)量

事件標(biāo)志組

消息郵箱

消息隊(duì)列

建立事件

OSSemCreate();

OSMutexCreate();

OSFlagCreate();

OSMboxCreate();

OSQCreate();

刪除事件

OSSemDel ();

OSMutexDel ();

OSFlagDel ();

OSMboxDel ();

OSQDel ();

等待事件

OSSemPend();

OSMutexPend();

OSFlagPend();

OSMboxPend();

OSQPend();

發(fā)送事件

OSSemPost();

OSMutexPost();

OSFlagPost();

OSMboxPost();

OSQPost();

無等待獲得事件

OSSemAccept();

OSMutexAccept();

OSFlagAccept();

OSMboxAccept();

OSQAccept();

查詢事件狀態(tài)

OSSemQuery();

OSMutexQuery();

OSFlagQuery();

OSMboxQuery();

OSQQuery();

RT-Thread

功能

信號(hào)量

互斥信號(hào)量

事件標(biāo)志組

消息郵箱

消息隊(duì)列

建立事件

靜態(tài)方法:

rt_sem_init();

動(dòng)態(tài)方法:

rt_sem_create();

靜態(tài)方法:

rt_mutex_init ();

動(dòng)態(tài)方法:

rt_mutex_create ();

靜態(tài)方法:

rt_event_init ();

動(dòng)態(tài)方法:

rt_event_create ();

靜態(tài)方法:

rt_mb_init ();

動(dòng)態(tài)方法:

rt_mb_create ();

靜態(tài)方法:

rt_mq_init ();

動(dòng)態(tài)方法:

rt_mq_create ();

刪除事件

靜態(tài)方法:

rt_sem_detach();

動(dòng)態(tài)方法:

rt_sem_delete();

靜態(tài)方法:

rt_mutex_detach ();

動(dòng)態(tài)方法:

rt_mutex_delete ();

靜態(tài)方法:

rt_event_detach ();

動(dòng)態(tài)方法:

rt_event_delete ();

靜態(tài)方法:

rt_mb_detach ();

動(dòng)態(tài)方法:

rt_mb_delete ();

靜態(tài)方法:

rt_mq_detach ();

動(dòng)態(tài)方法:

rt_mq_delete ();

等待事件

rt_sem_take();

rt_mutex_take();

rt_event_recv();

rt_mb_recv();

rt_mq_recv();

發(fā)送事件

rt_sem_release();

rt_mutex_release();

rt_event_send();

rt_mb_send_wait();

rt_mq_send();

rt_mq_urgent();

無等待獲得事件

rt_sem_trytake();

rt_mb_send();

查詢事件狀態(tài)

其他

rt_sem_control();

執(zhí)行cmd,目前函數(shù)里面只有一個(gè)RT_IPC_CMD_RESET實(shí)現(xiàn)

rt_mutex_control();

目前函數(shù)直接返回err:

return -RT_ERROR;

rt_event_control();

執(zhí)行cmd,目前函數(shù)里面只有一個(gè)RT_IPC_CMD_RESET實(shí)現(xiàn)

rt_mb_control();

執(zhí)行cmd,目前函數(shù)里面只有一個(gè)RT_IPC_CMD_RESET實(shí)現(xiàn)

rt_mq_control();

執(zhí)行cmd,目前函數(shù)里面只有一個(gè)RT_IPC_CMD_RESET實(shí)現(xiàn)

整個(gè)移植過程就這樣,最后談下RT-Thread。

接觸RT-Thread之后,個(gè)人還是蠻喜歡的,入門很快,編碼風(fēng)格很好。它是一個(gè)分層的操作系統(tǒng),有豐富的系統(tǒng)組件,例如LwIP輕型TCP/IP協(xié)議棧、文件系統(tǒng)等,使用方便。

開發(fā)過程中對RT-Thread與μCOS最大的不同體驗(yàn)一個(gè)是在RT-Thread中的靜態(tài)和動(dòng)態(tài)方法的區(qū)分,另一個(gè)是內(nèi)存安全性方面。以前項(xiàng)目跑在μCOS上很多double free的問題,μCOS不做任何警告,完全看不出來有什么問題,只是時(shí)間久了,系統(tǒng)復(fù)位;移植到RT-Thread上之后double free系統(tǒng)會(huì)assert,一次性解決了好些bug。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5068

    文章

    19021

    瀏覽量

    303317
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1273

    瀏覽量

    39924

原文標(biāo)題:【周四RTOS專欄】一個(gè)美女程序員的μCOS-Ⅱ到RT-Thread移植筆記?

文章出處:【微信號(hào):elecfans,微信公眾號(hào):電子發(fā)燒友網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    從μCOS-Ⅱ到RT-Thread移植方法是什么

    公司項(xiàng)目原先使用μCOS-II,但是μCOS存在商業(yè)使用付費(fèi)問題,故而我們轉(zhuǎn)向用國產(chǎn)開源免費(fèi)RTOS RT-Thread替代,花了一天半的時(shí)間將原來的μCOS
    發(fā)表于 06-04 04:35

    移植RT-Thread的原理與方法

    ,在rtt論壇搜索“國產(chǎn)MCU移植”即可閱讀。本文不介紹具體移植步驟,而是如往常一樣,分享移植的原理與方法。 移植原理 移植一款軟件,無非是
    的頭像 發(fā)表于 09-17 09:41 ?7715次閱讀

    【國產(chǎn)MCU系列】在 HK32F030 上移植 RT-Thread Nano

    如需下載相關(guān)開源資料請點(diǎn)擊閱讀原文這是一個(gè)航順 HK32F030 的 RT-Thread Nano 移植示例,記錄了在 Keil 裸機(jī)工程的基礎(chǔ)上進(jìn)行 RT-Thread Nano
    發(fā)表于 11-21 18:51 ?42次下載
    【國產(chǎn)MCU系列】在 HK32F030 上<b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    RT-Thread Nano入門學(xué)習(xí)筆記

    RT-Thread Nano入門學(xué)習(xí)筆記
    發(fā)表于 11-26 12:36 ?20次下載
    <b class='flag-5'>RT-Thread</b> Nano入門學(xué)習(xí)<b class='flag-5'>筆記</b>

    RT-Thread系統(tǒng)移植到STM32f103

    RT-Thread系統(tǒng)移植到STM32f103
    發(fā)表于 12-09 12:51 ?26次下載
    <b class='flag-5'>RT-Thread</b>系統(tǒng)<b class='flag-5'>移植</b>到STM32f103

    HC32F460移植RT-Thread Nano+FinSh工程源碼下載

    HC32F460移植RT-Thread Nano+FinSh工程源碼下載
    發(fā)表于 01-05 10:30 ?6次下載

    RT-Thread 應(yīng)用筆記 - RTC Alarm 組件的使用

    RT-Thread 應(yīng)用筆記 - 不正確使用LOG也會(huì)引發(fā)hard faultRT-Thread 應(yīng)用筆記 - RTC Alarm 組件的使用RT-
    發(fā)表于 01-25 18:18 ?10次下載
    <b class='flag-5'>RT-Thread</b> 應(yīng)用<b class='flag-5'>筆記</b> - RTC Alarm 組件的使用

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 理解defunct僵尸線程

    RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對象rt_objectRT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對象管理RT-Thread 內(nèi)核學(xué)
    發(fā)表于 01-25 18:19 ?8次下載
    <b class='flag-5'>RT-Thread</b> 內(nèi)核學(xué)習(xí)<b class='flag-5'>筆記</b> - 理解defunct僵尸線程

    基于 Keil MDK 移植 RT-Thread Nano

    本文介紹如何基于 Keil MDK 移植 RT-Thread Nano ,并以一個(gè) stm32f103 的基礎(chǔ)工程作為示例進(jìn)行講解。 RT-Thread Nano 已集成在 Keil
    發(fā)表于 01-26 17:04 ?16次下載
    基于 Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    如何創(chuàng)建RT-Thread Nano工程

    本文將嘗試使用國產(chǎn)的嵌入式實(shí)時(shí)操作系統(tǒng)RT-Thread,相比較于FreeRTOS,RT-Thread還是有很多有點(diǎn)的,比如有Fish命令行界面,國產(chǎn)開源免費(fèi),Nano版本代碼量極小,移植
    的頭像 發(fā)表于 03-19 12:13 ?3745次閱讀

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    RT-Thread 簡介 作為一名 RTOS 的初學(xué)者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會(huì)逐漸發(fā)現(xiàn) RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發(fā)表于 07-09 11:27 ?4484次閱讀
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)<b class='flag-5'>筆記</b> <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

    RT-Thread學(xué)習(xí)筆記】Makefile的FORCE

    RT-Thread學(xué)習(xí)筆記】十分鐘學(xué)會(huì)Makefile的FORCE
    的頭像 發(fā)表于 07-30 13:55 ?2465次閱讀
    【<b class='flag-5'>RT-Thread</b>學(xué)習(xí)<b class='flag-5'>筆記</b>】Makefile的FORCE

    RT-Thread文檔_內(nèi)核移植

    RT-Thread文檔_內(nèi)核移植
    發(fā)表于 02-22 18:31 ?3次下載
    <b class='flag-5'>RT-Thread</b>文檔_內(nèi)核<b class='flag-5'>移植</b>

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與<b class='flag-5'>移植</b>

    機(jī)智云設(shè)備移植RT-Thread

    開發(fā)環(huán)境:Keil版本:V5.30RT-Thread版本:3.1.5STM32cubeMX:V6.0.1開發(fā)板MCU:STM32F103機(jī)智云平臺(tái)生成的應(yīng)用代碼是裸機(jī)版本的,而在實(shí)際應(yīng)用過
    的頭像 發(fā)表于 04-19 18:39 ?958次閱讀
    機(jī)智云設(shè)備<b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b>