移植uC/OS-II
我们以上一篇工程为基础,进行移植。然后我们还需要用到正点原子F4【实验56 UCOSII实验1-任务调度】的代码,将实验56工程下的UCOSII文件夹直接复制到我们上一篇建立的工程文件夹下,然后在工程目录中添加对应的文件夹以及C文件,最后添加头文件路径。
添加及修改GUI_X_uCOS.c文件
在工程目录的GUI_X文件夹中添加GUI_X_uCOS.c文件,并修改2处:
void GUI_X_ExecIdle (void)
{
//OS_X_Delay(1);
OSTimeDly(50);
}
原来是OS_X_Delay(1);会提示没定义,所以改一下。
此外,
static void CheckInit (void)
{
if (KeyIsInited == 0) {
KeyIsInited = 1;
GUI_X_Init();
}
}
本来一个是FALSE,一个是TRUE,然后提示我FALSE和TRUE未定义,所以这么改。
修改GUI_X.c
不修改会提示和GUI_X_uCOS.c文件出现重定义错误。把GUI_X.c文件中的除了最后
void GUI_X_Log (const char *s) { GUI_USE_PARA(s); }
void GUI_X_Warn (const char *s) { GUI_USE_PARA(s); }
void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }
三句话其余的全部注释掉——最后3句不能注释,因为其他文件引用了这3个函数。
修改GUIConf.h
打开工程目录文件夹Config,修改其中的GUIConf.h文件:
#define GUI_OS (1)
1代表支持操作系统。
主程序修改
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "ili93xx.h"
#include "touch.h"
#include "gui.h"
#include "24cxx.h"
#include "ucos_ii.h"
int t;
/////////////////////////UCOSII任务设置///////////////////////////////////
//START 任务
//设置任务优先级
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE 64
//任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);
//触摸屏任务
//设置任务优先级
#define TOUCH_TASK_PRIO 6
//设置任务堆栈大小
#define TOUCH_STK_SIZE 64
//任务堆栈
OS_STK TOUCH_TASK_STK[TOUCH_STK_SIZE];
//任务函数
void touch_task(void *pdata);
int main(void)
{
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
delay_init(168); //初始化延时函数
LED_Init(); //初始化LED时钟
uart_init(84,115200); //初始化串口波特率为115200——必须要有这句话
LCD_hard_Init();
TP_Init(); //触摸屏初始化
GUI_Init();
GUI_SetBkColor(GUI_BLUE);//设置背景色
GUI_SetColor(GUI_WHITE);
GUI_Clear();
GUI_SetFont(&GUI_Font24_ASCII);
GUI_DispStringAt("- - STM32F4 - -",4,10);
GUI_DispStringAt("- - UCGUI3.98 - -",4,40);
GUI_DispStringAt("- - SUCCESSFULLY - -",4,70);
delay_ms(2000);// 延时2s
GUI_Clear();
GUI_CURSOR_Show();
OSInit(); //初始化UCOSII
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart(); //启动UCOSII
}
//开始任务
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
OSTaskCreate(touch_task,(void *)0,(OS_STK*)&TOUCH_TASK_STK[TOUCH_STK_SIZE-1],TOUCH_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}
//TOUCH任务
void touch_task(void *pdata)
{
while(1)
{
t++;
delay_ms(10);
if(t==50)
{
LED0=~LED0;
t=0;
}
GUI_TOUCH_Exec();
GUI_Exec();//GUI事件更新
};
}