STM32的裸機工程模板直接使用野火STM32開發板配套的固件庫例程便可。能夠從我github
上獲取github.com/jiejieTop/T…git
TencentOS tiny的源碼可從TencentOS tiny
GitHub倉庫地址github.com/Tencent/Ten…下載,若是GitHub下載慢,也能夠經過騰訊工蜂開源倉下載,地址:git.code.tencent.com/Tencent_Ope… ,你們在移植時並不須要把整個TencentOS tiny
源碼放進工程文件中,不然工程的代碼量太大。傑傑將在下文講解如何將TencentOS tiny
移植到工程中去,以及如何把TencentOS tiny
源碼中的核心部分單獨提取出來,方便之後在不一樣的平臺上移植。目前使用的是TencentOS tiny
最新版本,因爲TencentOS tiny
在不斷更新,若是之後TencentOS tiny
更新到更高的版本,則以最新的版本爲準。github
打開TencentOS tiny
源碼文件,能夠看見裏面有12
個文件夾,下面先來了解主要文件夾及其子文件夾的做用,而後將TencentOS tiny
源碼的核心文件提取出來,添加到工程根目錄下的文件夾中,由於工程只須要有用的源碼文件,而不是所有的TencentOS tiny
源碼,因此能夠避免工程過於龐大。json
一級目錄 | 二 / 三級目錄 |
說明(傑傑) |
---|---|---|
arch |
arm |
TencentOS tiny適配的IP核架構(含M核中斷、調度、tick相關代碼),對咱們的移植很重要 |
arch | risc-v | TencentOS tiny適配的risc-v架構 |
board |
TencentOStinyEVB_MX |
TencentOS tiny 定製開發板demo,包含AT適配框架、MQTT協議、安全組件等 |
component |
connectivity / loraWAN |
loRaWAN協議棧實現源碼及適配層 |
connectivity / Eclipse-Paho-MQTT | MQTT協議棧實現源碼及適配層 | |
connectivity / TencentCloud_SDK | 騰訊雲C-SDK實現源碼及適配層 | |
fs | 文件系統實現源碼 | |
security | mbedtls 安全協議源碼 | |
utils | 包含json相關源碼 | |
devices |
TencentOS tiny適配的一些外設驅動(如串口wifi gprs 驅動等) |
|
doc |
TencentOS tiny相關技術文檔及開發指南(建議多看這部分 ) |
|
examples |
TencentOS tiny提供的功能示例 |
|
kernel |
core |
TencentOS tiny內核源碼(這部分是最重要的) |
hal |
TencentOS tiny驅動抽象層 |
|
pm | TencentOS tiny低功耗模塊源碼 | |
net |
at | TencentOS tiny爲串口類通訊模組提供的AT框架實現層 |
loramodulewrapper | TencentOS tiny爲串口類LoraWAN模塊提供的移植框架 | |
lwip | Lwip協議實現源碼及適配層 | |
salmodulewrapper | TencentOS tiny爲串口類網絡模塊(wifi gprs)提供的socket移植框架 | |
tencentfirmwaremodule_wrapper | TencentOS tiny提供的騰訊定製模組移植框架 | |
osal |
cmsis_os | TencentOS tiny提供的cmsis os 適配 |
platform |
hal | TencentOS tiny適配的部分芯片的驅動實現源碼 |
vendor_bsp |
芯片廠家提供的原廠bsp固件庫,如STM32的HAL庫 | |
test |
存放TencentOS tiny提供的一些測試代碼,含內核及上層模塊示例及測試代碼 |
|
tools |
存放TencentOS tiny提供的工具,小程序,配置工具等 |
簡單提一下咱們的重點文件夾:小程序
TencentOS tiny
是軟件,單片機是硬件,爲了使TencentOS tiny
運行在單片機上面,TencentOS tiny
和單片機必須關聯在一塊兒,那麼如何關聯呢?仍是要經過代碼來關聯,這部分關聯的文件叫接口文件,一般由彙編語言和C語言聯合編寫。這些接口文件都是跟硬件密切相關的,不一樣的硬件接口文件是不同的,但都大同小異。TencentOS tiny
在archarmarm-v6m
目錄中存放了cortex m0
內核的單片機的接口文件,在archarmarm-v7m
目錄中存放了cortex m三、m4
和m7
內核的單片機的接口文件,以及一些通用的接口文件,基於這些內核的mcu均可以使用裏面的接口文件。 kernel
是TencentOS tiny
內核核心源碼,它的重要性我也不用多說,畢竟整個內核就是由這裏面的文件組成,而其餘文件夾都是基於內核的組件。 將裸機工程源碼重命名爲hello-world,而後在裸機工程中新建一個TencentOS
文件夾,接着將kernel
文件夾、arch
文件夾、添加到TencentOS
文件夾下:安全
除了TencentOS tiny
的核心文件外,還須要移植一下其餘文件,如關於TencentOS tiny
系統的配置文件。這是一些能夠被用戶修改的文件,因此會放在具體的工程文件中。board
就是TencentOS tiny
爲一些經常使用開發板開發的demo
文件夾,其內有各個工程的配置文件,選一個與移植芯片最相機的開發板,找到它的配置文件tos_config.h
,好比咱們能夠選擇:TencentOS-tinyboardSTM32F103_SIM800ATOS-CONFIG
路徑下的配置文件,把它拷貝到咱們工程中的TencentOS
文件夾下,固然你也能夠把整個TOS-CONFIG
目錄拷貝過去,把其餘無關的配置刪掉就行了。網絡
這個配置文件很重要,後續在移植工程時,咱們須要對這個配置文件進行修改,這樣子能夠裁剪TencentOS tiny
的功能,獲得最適合的工程配置。架構
打開TencentOS-Demohello-worldProjectRVMDK(uv5)
路徑下的TencentOS.uvprojx
文件。app
3
個工程分組,分別爲tos/kernel、tos/arch、tos/config
,這樣能夠見其名知其意,這些工程分組分別保存TencentOS tiny
的內核源碼、接口文件、以及配置文件。TencentOS-Demohello-worldTencentOSkernelcore
路徑下的全部.c文件
添加到tos/kernel
工程分組中,也將TencentOS-Demohello-worldTencentOSkernelpm
目錄下的全部.c文件
添加到tos/kernel
工程分組中:TencentOS-Demohello-worldTencentOSarcharmarm-v7mcommon
路徑下的 tos_cpu.c、tos_fault.c
添加到tos/arch
工程分組下,也將TencentOS-Demohello-worldTencentOSarcharmarm-v7mcortex-m3armcc
路徑下的 port_s.S、port_c.c
文件添加到tos/arch
工程分組下TencentOS-Demohello-worldTencentOSTOS-CONFIG
路徑下的tos_config.h
文件添加到tos/config
工程分組中。 須要注意的是,在tos/arch
分組中添加的port_s.S
文件,須要在添加時選擇文件類型爲「All files (*.*)」
,添加(.h)文件類型的時候也須要選擇文件類型爲`「All files (.*)」`框架
添加完成後的文件:socket
編譯時須要爲這些源文件指定頭文件的路徑,不然編譯會報錯。TencentOS tiny
的源碼中有不少頭文件,必須將對應的路徑添加到開發環境裏。在添加TencentOS tiny
源碼時,一些其餘的頭文件夾也被複制到了工程目錄中,因此這些文件夾的路徑也要加到開發環境中。這些頭文件的路徑分別是:
..\..\TencentOS\arch\arm\arm-v7m\common\include
..\..\TencentOS\arch\arm\arm-v7m\cortex-m3\armcc
..\..\TencentOS\kernel\core\include
..\..\TencentOS\kernel\pm\include
..\..\TencentOS\TOS-CONFIG複製代碼
同時還要在配置中勾選支持C99
模式:
若是你走到這一步,那麼能夠嘗試編譯一下,不過我測試時編譯是沒經過的,緣由是缺乏了部分頭文件:不過這不影響,咱們在配置文件tos_config.h
中修改一下就好,添加兩句話
#include "stm32f10x.h"
#include <stdio.h> // 或者 #include <stddef.h>複製代碼
以下圖:
鑑於TencentOS tiny已經處理好PendSV與SysTick
中斷了,就不須要用戶本身去處理,因此要在中斷相關的源文件(stm32f10x_it.c文件
)中註釋(或者刪除)PendSV_Handler()
函數。
SysTick
中斷服務函數是一個很是重要的函數,TencentOS tiny
全部跟時間相關的事情都在裏面處理,SysTick
就是TencentOS tiny
的一個心跳時鐘,驅動着TencentOS tiny
的運行,就像人的心跳同樣,假如沒有心跳,咱們就至關於「掛掉」
,一樣的,TencentOS tiny
沒有了心跳,那麼它就會卡死在某個地方,不能進行任務調度,不能運行任何的東西,所以咱們須要實現一個TencentOS tiny
的心跳時鐘。代碼以下:
注意:SysTick_Handler()
中調用的都是TencentOS tiny
中的函數,因此須要在stm32f10x_it.c
文件中包含tos.h
頭文件。
#include "tos.h"
// SysTick_Handler()函數
void SysTick_Handler(void)
{
if (tos_knl_is_running())
{
tos_knl_irq_enter();
tos_tick_handler();
tos_knl_irq_leave();
}
}複製代碼
當你走到這一步,編譯是不會出錯了,此時咱們已經徹底移植好操做系統了,那麼能夠編寫代碼了,如今編寫一個測試代碼,在main.c
文件中:
#include "stm32f10x.h"
#include "bsp_usart.h"
#include "tos.h"
k_task_t task;
k_stack_t task_stack[1024];
void test_task(void *Parameter)
{
while(1)
{
printf("hello world!\r\n");
tos_task_delay(1000);
}
}
/**
* @brief 主函數
* @author 傑傑
* @retval 無
*/
int main(void)
{
k_err_t err;
/*初始化USART 配置模式爲 115200 8-N-1,中斷接收*/
USART_Config();
printf("Welcome to TencentOS tiny\r\n");
tos_knl_init(); // TOS Tiny kernel initialize
err = tos_task_create(&task,
"task1",
test_task,
NULL,
2,
task_stack,
1024,
20);
if(err != K_ERR_NONE)
printf("TencentOS Create task fail! code : %d \r\n",err);
tos_knl_start(); // Start TOS Tiny
}複製代碼
而後編譯,下載到開發板上,就經過串口能夠看到程序已經跑起來了:
至此,TencentOS tiny
移植到stm32f1
的過程所有完成!
相關代碼能夠在公衆號後臺獲取。歡迎關注「物聯網IoT開發」公衆號