TencentOS tiny porting(MacOS_STM32CubeIDE).md 5.4 KB
Newer Older
S
fix doc  
supowang 已提交
1
# TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版)
S
supowang 已提交
2 3 4 5 6 7 8 9

## 一、工程创建

 具体的工程创建方法和初始参数设置方法略去。
 
 需要强调的是本文是以`STM32L431`芯片为基础的,如果是其它芯片,后面的步骤请做相应的调整。
 
 最后生成的工程目录如下:
S
fix doc  
supowang 已提交
10
![](https://main.qcloudimg.com/raw/d692d86434c953c178010acfcbecf7e7.png)
S
supowang 已提交
11 12 13 14 15
 
## 二、TencentOS tiny代码准备

只需要保留TencentOS这些目录下的代码,其它目录皆可删除。

S
fix doc  
supowang 已提交
16
![](https://main.qcloudimg.com/raw/25043ac8b3b6944670867960c4230abb.png)
S
supowang 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

 
`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`拷贝到第一步创建的工程目录里

S
fix doc  
supowang 已提交
41
![](https://main.qcloudimg.com/raw/c0cd1bc6d8e58f52939e19a3a13db74a.png)
S
supowang 已提交
42 43 44

 刷新工程
 
S
fix doc  
supowang 已提交
45
![](https://main.qcloudimg.com/raw/14a6bf4775db3a9bc7162a8eebeddbfd.png)
S
supowang 已提交
46 47 48

 把代码添加到工程里
 
S
fix doc  
supowang 已提交
49
![](https://main.qcloudimg.com/raw/1315cce3621fa7f2ff20a135d4d7bf3a.png)
S
supowang 已提交
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

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/
```