實驗二、ucos操作系統的移植
一、實驗目的
1、掌握ucos到STM32的移植方法;
2、熟悉通過C語音處理底層寄存器的技巧;
3、了解STM32在ucos任務切換時的處理;
4、規范編程格式。
二、實驗內容
本次實驗通過用C語言編寫6個操作系統相關函數和用匯編語言編寫4個與處理器相關的函數,將實時操作系統µC/OS-Ⅱ移植到芯片STM32F103ZE中,并創建兩個用戶任務點亮led。學會操作系統的移植方法,深入掌握嵌入式操作系統µC/OS-Ⅱ在初始化任務和任務調度的實現方法,直觀了解實時操作系統的體系結構和設計思想。
三、預備知識
基本單片機硬件知識、單片機軟件編程語言、程序創建和調試的基本方法、ucos操作系統的任務調度原理、STM32的寄存器架構。
四、實驗設備及工具
硬件:STM32開發平臺
軟件:STM32官方庫;PC機操作系統Windows 98、Windows 2000或Windows XP;KEIL MDK集成開發環境;串口轉usb驅動。
五、實驗步驟
1、按實驗一的步驟新建一個工程Proj2_ucos。
2、將移植好的ucos源代碼整個拷貝到我們的新建的工程目錄中,然后按對應的文件路徑添加到keil工程里(os_dbg.c和os_dbg_r.c只添加一個),如圖6和圖7。
圖6 圖7
3、配置工程相關屬性(與實驗一庫應用配置一樣),記得將ucos的頭文件路徑添加到工程的include path上面去,找到stm2f10x_it.c的PendSV_Handler函數注釋掉,main文件中將includes.h包含進來,主函數為空,編譯通過。
4、在main.c中建立sys_init()函數編寫操作系統運行需要的硬件相關初始化(見代碼),然后修改stm32f10x_it.c中的系統心跳中斷函數并加入頭文件includes.h(見代碼,)。
/*********************************************************************
* 函數名稱:sys_init
* 函數功能:嵌套向量中斷優先級分組,時鐘心跳定時初始化1/200 s
* 參數: 無
*********************************************************************/
void sys_init()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SysTick_Config(SystemCoreClock/200);
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
OSIntEnter();
OSTimeTick();
OSIntExit();
}
5、編寫用戶任務函數和相關的初始化。
/*****************************************************
* 函數名稱: led_init
* 函數功能: 初始化LED
* 參 數:
* 其 他:
********************************************************/
void led_init()
{
GPIO_InitTypeDef gpin_init_struct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
gpin_init_struct.GPIO_Pin = GPIO_Pin_5;
gpin_init_struct.GPIO_Speed = GPIO_Speed_2MHz;
gpin_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &gpin_init_struct); //B口led1
GPIO_Init(GPIOE, &gpin_init_struct); //E口led2
}
/*****************************************************
* 函數名稱: my_task
* 函數功能: 用戶任務
* 參 數:
* 其 他:
********************************************************/
void my_task()
{
sys_init();
led_init();
OSStatInit();
while(1)
{
LED1_ON;
LED2_OFF;
OSTimeDly(50);
LED1_OFF;
LED2_ON;
OSTimeDly(100);
}
}
6、最后在主函數中創建任務并啟動操作系統。編譯并調試運行。
#include "stm32f10x.h"
#include "includes.h"
#define LED2_ON GPIO_ResetBits(GPIOB, GPIO_Pin_5)
#define LED2_OFF GPIO_SetBits(GPIOB, GPIO_Pin_5)
#define LED1_ON GPIO_ResetBits(GPIOE, GPIO_Pin_5)
#define LED1_OFF GPIO_SetBits(GPIOE, GPIO_Pin_5)
OS_STK task_stk[128];
void my_task(void);
void led_init(void);
void sys_init(void);
int main()
{
OSInit();
OSTaskCreate(my_task, (void *)0, (OS_STK *)&task_stk[127], 10);
OSStart();
while(1);
}
|