基於STM32使用HAL庫手把手移植華爲LiteOS系統

基於STM32使用HAL庫手把手移植華爲LiteOS系統



(一)說明

本章節實驗工程源碼下載:https://github.com/wowyyy/STM32_LiteOS_Demogit

華爲LiteOS內核源碼下載地址:https://github.com/LiteOS/LiteOS,選擇develop分支下載。github

在這裏插入圖片描述


(二)裸機工程建立

使用STM32CubeMX建立裸機工程:less

這裏我是用的芯片是STM32F103RBT6,時鐘主頻爲72MHz,配置時鐘樹:函數

在這裏插入圖片描述

配置調試串口1:測試

在這裏插入圖片描述

配置兩個LED燈:
在這裏插入圖片描述
url

因爲LiteOS使用系統嘀嗒定時器看成心跳,HAL庫也使用了這個定時器,因此咱們將HAL庫的定時器改成其餘,這裏我該爲了定時器4:spa

在這裏插入圖片描述
配置中斷,這裏我選擇了組4,也就是所有爲搶佔優先級:
.net

在這裏插入圖片描述
取消掉如下兩個中斷服務函數的生成,由於ListOS已經實現了這兩個函數:
3d

在這裏插入圖片描述
最後輸出工程便可!
調試


(三)移植LiteOS

下載解壓LiteOS,咱們須要的文件有:

  • LiteOS-develop\arch\arm\arm-m\cortex-m3\keil\los_dispatch_keil.S
    (注:由於我使用的是STM32F1系列是M3內核因此選擇cortex-m3文件夾下的,若是是F4系列那麼就是M4內核應該選擇cortex-m4文件夾下的文件)
  • LiteOS-develop\arch\arm\arm-m\src目錄下所有源文件
  • LiteOS-develop\kernel\base\core目錄下所有源文件
  • LiteOS-develop\kernel\base\ipc目錄下所有源文件
  • LiteOS-develop\kernel\base\mem\bestfit_little目錄下所有源文件
  • LiteOS-develop\kernel\base\mem\common目錄下所有源文件
  • LiteOS-develop\kernel\base\mem\membox目錄下所有源文件
  • LiteOS-develop\kernel\base\misc目錄下所有源文件
  • LiteOS-develop\kernel\base\om目錄下所有源文件
  • LiteOS-develop\kernel\base\core目錄下所有源文件
  • LiteOS-develop\kernel\base\core目錄下所有源文件
  • LiteOS\kernel\extended\tickless目錄下所有源文件
  • LiteOS\kernel\los_init.c
  • 拷貝示例工程下的OS_CONFIG目錄下的頭文件 (此目錄是在示例工程LiteOS-develop\targets\STM32F103VET6_NB_GCC\OS_CONFIG中)

在Keil中添加源碼,以下圖所示:

在這裏插入圖片描述

添加頭文件包含,以下圖所示:
在這裏插入圖片描述

  • 修改OS_CONFIG/target_config.h文件,找到BOARD_SRAM_SIZE_KB宏,此宏定義了SRAM(內存)的大小,STM32F103RB是20K,因此此處改成20。

  • 修改宏LOSCFG_PLATFORM_HWI爲NO。此宏控制着系統中斷的管理方式,爲NO表示系統中斷不被系統管理,爲YES表示系統接管中斷。STM32的中斷管理已經很好了不須要系統接管。


(四)系統運行測試

這裏建立了三個任務:

  • led1燈間隔1m反轉電平
  • led2燈間隔300ms反轉電平
  • print每隔2s串口打印任務
int fputc(int ch, FILE* fp)
{ 
	while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TXE) != SET);
	huart1.Instance->DR = ch & 0XFF;
	return ch;
}

void* led1_task(UINT32 arg)
{ 
	for(;;)
	{ 
		HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
		LOS_TaskDelay(1000);
	}
}

void* led2_task(UINT32 arg)
{ 
	for(;;)
	{ 
		HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
		LOS_TaskDelay(300);
	}
}

void* print_task(UINT32 arg)
{ 
	for(;;)
	{ 
		PRINTK("Hello LiteOS !\r\n");
		LOS_TaskDelay(2000);
	}
}

UINT32 led1_task_handle;
UINT32 led2_task_handle;
UINT32 print_task_handle;

int main(void)
{ 
	TSK_INIT_PARAM_S task_param;
	
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();
		
	LOS_KernelInit();
	
	task_param.pcName = "led1_task";
	task_param.pfnTaskEntry = led1_task;
	task_param.uwStackSize = 512;
	task_param.usTaskPrio = 4;
	if(LOS_TaskCreate(&led1_task_handle, &task_param) != LOS_OK)
	{ 
		PRINT_ERR("create led1 task failed!\r\n");
	}
	
	task_param.pcName = "led2_task";
	task_param.pfnTaskEntry = led2_task;
	task_param.uwStackSize = 512;
	task_param.usTaskPrio = 4;
	if(LOS_TaskCreate(&led2_task_handle, &task_param) != LOS_OK)
	{ 
		PRINT_ERR("create led2 task failed!\r\n");
	}
	
	task_param.pcName = "print_task";
	task_param.pfnTaskEntry = print_task;
	task_param.uwStackSize = 512;
	task_param.usTaskPrio = 4;
	if(LOS_TaskCreate(&print_task_handle, &task_param) != LOS_OK)
	{ 
		PRINT_ERR("create print task failed!\r\n");
	}
	
	LOS_Start();
	
    for(;;)
	{ 
	}
}

ends…

相關文章
相關標籤/搜索