初學RT-Thread,官網給的歷程大多是HAL庫版本的,原來做的項目中都是用的固件庫,底層驅動移植起來相當麻煩,于是網上找資料動手移植起來,實現功能:①線程中LED閃爍;②軟件定時器回調函數打印“timer1 is timeout”;③串口DMA接收數據,郵箱實現線程同步(信號量本已實現,為了驗證郵箱實現同樣的功能,屏蔽)并打印接收到的數據。
平臺:正點原子精英開發板
全部資料51hei下載地址:
RTT-RTC做TICK.7z
(2.03 MB, 下載次數: 29)
2019-8-2 04:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
RT-Thread-串口DMA接收.7z
(846.48 KB, 下載次數: 60)
2019-8-2 04:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
STM32單片機源程序如下:
- /*
- *************************************************************************
- * 包含的頭文件
- *************************************************************************
- */
- #include "board.h"
- #include "rtthread.h"
- #include <string.h>
- /*
- ******************************************************************
- * 變量
- ******************************************************************
- */
- /* 定義線程控制塊 */
- static rt_thread_t usart_thread = RT_NULL;
- /* 定義線程控制塊 */
- static rt_thread_t led1_thread = RT_NULL;
- /* 定義信號量控制塊 */
- rt_sem_t test_sem = RT_NULL;
- /* 郵 箱 控 制 塊 */
- struct rt_mailbox mb;
- /* 用 于 放 郵 件 的 內 存 池 */
- static char mb_pool[128];
- /* 定 時 器 的 控 制 塊 */
- static rt_timer_t timer1;
- /************************* 全局變量聲明 ****************************/
- /*
- * 當我們在寫應用程序的時候,可能需要用到一些全局變量。
- */
- /* 相關宏定義 */
- extern char Usart_Rx_Buf[USART_RBUFF_SIZE];
- /*
- *************************************************************************
- * 函數聲明
- *************************************************************************
- */
- static void usart_thread_entry(void* parameter);
- static void led1_thread_entry(void* parameter);
- static void timeout1(void *parameter);
- /*
- *************************************************************************
- * main 函數
- *************************************************************************
- */
- /**
- * @brief 主函數
- * @param 無
- * @retval 無
- */
- int main(void)
- {
- rt_err_t result;
- /*
- * 開發板硬件初始化,RTT系統初始化已經在main函數之前完成,
- * 即在component.c文件中的rtthread_startup()函數中完成了。
- * 所以在main函數中,只需要創建線程和啟動線程即可。
- */
- /* 創建一個信號量 */
- //test_sem = rt_sem_create("test_sem",/* 消息隊列名字 */
- // 0, /* 信號量初始值,默認有一個信號量 */
- // RT_IPC_FLAG_FIFO); /* 信號量模式 FIFO(0x00)*/
- //if (test_sem != RT_NULL)
- //rt_kprintf("信號量創建成功!\n\n");
- /* 初 始 化 一 個 mailbox */
- result = rt_mb_init(&mb,
- "mbt", /* 名 稱 是 mbt */
- &mb_pool[0], /* 郵 箱 用 到 的 內 存 池 是 mb_pool */
- sizeof(mb_pool) / 4, /* 郵 箱 中 的 郵 件 數 目 , 因 為 一 封 郵
- 件 占 4 字 節 */
- RT_IPC_FLAG_FIFO); /* 采 用 FIFO 方 式 進 行 線 程 等 待 */
- if (result != RT_EOK)
- {
- rt_kprintf("init mailbox failed.\n");
- return -1;
- }
- usart_thread = /* 線程控制塊指針 */
- rt_thread_create( "usart", /* 線程名字 */
- usart_thread_entry, /* 線程入口函數 */
- RT_NULL, /* 線程入口函數參數 */
- 512, /* 線程棧大小 */
- 2, /* 線程的優先級 */
- 20); /* 線程時間片 */
-
- /* 啟動線程,開啟調度 */
- if (usart_thread != RT_NULL)
- rt_thread_startup(usart_thread);
- else
- return -1;
-
- led1_thread = /* 線程控制塊指針 */
- rt_thread_create( "led1", /* 線程名字 */
- led1_thread_entry, /* 線程入口函數 */
- RT_NULL, /* 線程入口函數參數 */
- 512, /* 線程棧大小 */
- 3, /* 線程的優先級 */
- 20); /* 線程時間片 */
-
- /* 啟動線程,開啟調度 */
- if (led1_thread != RT_NULL)
- rt_thread_startup(led1_thread);
- else
- return -1;
- /* 創 建 定 時 器 1 周 期 定 時 器 */
- timer1 = rt_timer_create("timer1", timeout1,
- RT_NULL, 2500,
- RT_TIMER_FLAG_PERIODIC);
- /* 啟 動 定 時 器 1 */
- if (timer1 != RT_NULL)
- rt_timer_start(timer1);
- }
- /*
- *************************************************************************
- * 線程定義
- *************************************************************************
- */
- static void usart_thread_entry(void* parameter)
- {
- rt_err_t uwRet = RT_EOK;
- char *str;
- /* 任務都是一個無限循環,不能返回 */
- while (1)
- {
- //uwRet = rt_sem_take(test_sem, /* 獲取串口中斷的信號量 */
- //-1); /* 等待時間:0 */
- uwRet=rt_mb_recv(&mb, (rt_uint32_t *)&str, RT_WAITING_FOREVER);
-
- if(RT_EOK == uwRet)
- {
- //rt_kprintf("收到數據:%s\n",Usart_Rx_Buf);
- rt_kprintf("收到數據:%s\n",str);
- memset(Usart_Rx_Buf,0,USART_RBUFF_SIZE);/* 清零 */
- }
- }
- }
- static void led1_thread_entry(void* parameter)
- {
- while (1)
- {
- LED1_ON;
- rt_kprintf("LED1_ON\r\n");
- rt_thread_delay(5000); /* 延時500個tick */
-
- LED1_OFF;
- rt_kprintf("LED1_OFF\r\n");
- rt_thread_delay(5000); /* 延時500個tick */
- }
- }
- /* 定 時 器 2 超 時 函 數 */
- static void timeout1(void *parameter)
- {
- rt_kprintf("timer1 is timeout\n");
- }
- /********************************END OF FILE****************************/
復制代碼
|