Files
TencentOS-tiny/doc/TencentOS tiny porting(MacOS_STM32CubeIDE).md
daishengdong 74572d20fe refresh 开发指南.pdf
add new interface develop guide and sample code
2019-11-14 19:27:36 +08:00

226 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版)
## 一、工程创建
具体的工程创建方法和初始参数设置方法略去。
需要强调的是本文是以`STM32L431`芯片为基础的,如果是其它芯片,后面的步骤请做相应的调整。
最后生成的工程目录如下:
![](https://main.qcloudimg.com/raw/d692d86434c953c178010acfcbecf7e7.png)
## 二、TencentOS tiny代码准备
只需要保留TencentOS这些目录下的代码其它目录皆可删除。
![](https://main.qcloudimg.com/raw/25043ac8b3b6944670867960c4230abb.png)
`arch`目录里需要删除的所有代码目录列表
```
arch/arm/arm-v7m/cortex-m0+/
arch/arm/arm-v7m/cortex-m3/
arch/arm/arm-v7m/cortex-m4/armcc/
arch/arm/arm-v7m/cortex-m4/iccarm/
arch/arm/arm-v7m/cortex-m7/
```
**注: STM32L431是Cortex-M4内核所以如果是其它芯片例如STM32F103就应该删除`arch/arm/arm-v7m/cortex-m4/`目录,保留`arch/arm/arm-v7m/cortex-m3/gcc`目录。**
重命名代码顶层目录
```
$ mv TencentOS_tiny tiny
```
## 三、移植工作
1. 把代码`tiny`拷贝到第一步创建的工程目录里
![](https://main.qcloudimg.com/raw/c0cd1bc6d8e58f52939e19a3a13db74a.png)
刷新工程
![](https://main.qcloudimg.com/raw/14a6bf4775db3a9bc7162a8eebeddbfd.png)
把代码添加到工程里
![](https://main.qcloudimg.com/raw/1315cce3621fa7f2ff20a135d4d7bf3a.png)
2. 把下列头文件目录添加到工程里
```
tiny/arch/arm/arm-v7m/common/include/
tiny/arch/arm/arm-v7m/cortex-m4/gcc/ # 如上所述,这个目录视特定芯片而定
tiny/kernel/core/include/
tiny/kernel/pm/include/
tiny/osal/cmsis_os/
```
![](./picture/porting/porting_cubeide_006.png)
3. 在Inc目录下新建一个头文件`tos_config.h`
```
#ifndef _TOS_CONFIG_H_
#define _TOS_CONFIG_H_
#include "stm32l431xx.h" // 目标芯片头文件,视特定芯片而定
#include "stddef.h"
#define TOS_CFG_TASK_PRIO_MAX 10u // 配置TencentOS tiny默认支持的最大优先级数量
#define TOS_CFG_ROUND_ROBIN_EN 1u // 配置TencentOS tiny的内核是否开启时间片轮转
#define TOS_CFG_OBJECT_VERIFY 0u // 配置TencentOS tiny是否校验指针合法
#define TOS_CFG_EVENT_EN 1u // TencentOS tiny 事件模块功能宏
#define TOS_CFG_MMHEAP_EN 1u // 配置TencentOS tiny是否开启动态内存模块
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100 // 配置TencentOS tiny动态内存池大小
#define TOS_CFG_MUTEX_EN 1u // 配置TencentOS tiny是否开启互斥锁模块
#define TOS_CFG_QUEUE_EN 1u // 配置TencentOS tiny是否开启队列模块
#define TOS_CFG_TIMER_EN 1u // 配置TencentOS tiny是否开启软件定时器模块
#define TOS_CFG_SEM_EN 1u // 配置TencentOS tiny是否开启信号量模块
#if (TOS_CFG_QUEUE_EN > 0u)
#define TOS_CFG_MSG_EN 1u
#else
#define TOS_CFG_MSG_EN 0u
#endif
#define TOS_CFG_MSG_POOL_SIZE 10u // 配置TencentOS tiny消息队列大小
#define TOS_CFG_IDLE_TASK_STK_SIZE 256u // 配置TencentOS tiny空闲任务栈大小
#define TOS_CFG_CPU_TICK_PER_SECOND 1000u // 配置TencentOS tiny的tick频率
#define TOS_CFG_CPU_CLOCK (SystemCoreClock) // 配置TencentOS tiny CPU频率
#define TOS_CFG_TIMER_AS_PROC 1u // 配置是否将TIMER配置成函数模式
#endif
```
4. 修改`Src/stm32l4xx_it.c`里的代码:
* 将`void PendSV_Handler(void)`修改为`__weak void PendSV_Handler(void)`
* 在`SysTick_Handler`函数中`HAL_IncTick();`之后添加代码
```
if(tos_knl_is_running()) {
tos_knl_irq_enter();
tos_tick_handler();
tos_knl_irq_leave();
}
```
5. 修改`Src/main.c`
添加代码
```
#include "cmsis_os.h"
//task1
#define TASK1_STK_SIZE 512
void task1(void *pdata);
osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);
//task2
#define TASK2_STK_SIZE 512
void task2(void *pdata);
osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);
void task1(void *pdata)
{
while(1)
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
osDelay(200);
}
}
void task2(void *pdata) {
while(1) {
osDelay(1000);
}
}
```
**注代码中的LED是在创建工程的GPIO选项里指定的是`PC13`引脚这个是依据TencentOS tiny EVB_MX开发板而决定的相应的开发板请做相应调整。**
主函数代码
```
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
osKernelInitialize(); //TOS Tiny kernel initialize
osThreadCreate(osThread(task1), NULL); // Create task1
osThreadCreate(osThread(task2), NULL); // Create task2
osKernelStart(); //Start TOS Tiny
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
```
## 附1 清理代码目录命令
```
ls | egrep -v "arch|kernel|osal" | xargs rm -rf
rm -rf arch/arm/arm-v7m/cortex-m0+/
rm -rf arch/arm/arm-v7m/cortex-m3/
rm -rf arch/arm/arm-v7m/cortex-m4/armcc/
rm -rf arch/arm/arm-v7m/cortex-m4/iccarm/
rm -rf arch/arm/arm-v7m/cortex-m7/
```