feat(os): 添加 uC/OS-II 实时操作系统支持
- 在项目中集成 uC/OS-II 源代码和配置文件 - 修改 CMakeLists.txt 以包含 uC/OS-II 相关路径和源文件 - 更新 main.c 以使用 uC/OS-II 创建任务和管理调度 - 移除原有的裸机程序结构,为使用操作系统做准备
This commit is contained in:
164
Core/Src/main.c
164
Core/Src/main.c
@ -26,15 +26,9 @@
|
||||
#include <logger.h>
|
||||
#include <ge_interface/ge_interface.h>
|
||||
|
||||
#define RED 0xf800
|
||||
#define GREEN 0x07e0
|
||||
#define BLUE 0x001f
|
||||
#define WHITE 0xffff
|
||||
#define BLACK 0x0000
|
||||
#define YELLOW 0xFFE0
|
||||
#define GRAY0 0xEF7D
|
||||
#define GRAY1 0x8410
|
||||
#define GRAY2 0x4208
|
||||
#ifdef __USE_UCOS2__
|
||||
#include <ucos_ii.h>
|
||||
#endif
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
@ -67,6 +61,113 @@ void SystemClock_Config(void);
|
||||
|
||||
/* Private user code ---------------------------------------------------------*/
|
||||
/* USER CODE BEGIN 0 */
|
||||
#define TASK_SIZE 128
|
||||
#define STACK_NUM 6
|
||||
static OS_STK stacks[STACK_NUM][TASK_SIZE];
|
||||
#define GET_STACK_TOP(number) ((OS_STK*)&stacks[number][TASK_SIZE - 1])
|
||||
#define GET_STACK_BOTTOM(number) ((OS_STK*)&stacks[number][0])
|
||||
#define _STR(str) # str
|
||||
#define STR(str) _STR(str)
|
||||
#define CREATE_TASK(func, args, stack_num, prio) \
|
||||
OSTaskCreateExt(func, args, GET_STACK_TOP(stack_num), prio, stack_num, \
|
||||
GET_STACK_BOTTOM(stack_num), TASK_SIZE, STR(func), OS_TASK_OPT_STK_CHK);
|
||||
|
||||
static void T_ledR(void* args) {
|
||||
(void) args;
|
||||
const int delay_s = 1;
|
||||
while (1) {
|
||||
GE_LED_OFF(R);
|
||||
OSTimeDlyHMSM(0, 0, delay_s, 0);
|
||||
GE_LED_ON(R);
|
||||
OSTimeDlyHMSM(0, 0, delay_s, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void T_ledG(void* args) {
|
||||
(void) args;
|
||||
const int delay_s = 2;
|
||||
while (1) {
|
||||
GE_LED_OFF(G);
|
||||
OSTimeDlyHMSM(0, 0, delay_s, 0);
|
||||
GE_LED_ON(G);
|
||||
OSTimeDlyHMSM(0, 0, delay_s, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void T_ledB(void* args) {
|
||||
(void) args;
|
||||
const int delay_s = 3;
|
||||
while (1) {
|
||||
GE_LED_OFF(B);
|
||||
OSTimeDlyHMSM(0, 0, delay_s, 0);
|
||||
GE_LED_ON(B);
|
||||
OSTimeDlyHMSM(0, 0, delay_s, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void game_main(void* args) {
|
||||
(void) args;
|
||||
#define RED 0xf800
|
||||
#define GREEN 0x07e0
|
||||
#define BLUE 0x001f
|
||||
#define WHITE 0xffff
|
||||
#define BLACK 0x0000
|
||||
#define YELLOW 0xFFE0
|
||||
#define GRAY0 0xEF7D
|
||||
#define GRAY1 0x8410
|
||||
#define GRAY2 0x4208
|
||||
ge_input_event_t ievent;
|
||||
ge_render_rect_t player = {
|
||||
.pos.x = 60,
|
||||
.pos.y = 60,
|
||||
.size.x = 8,
|
||||
.size.y = 8,
|
||||
};
|
||||
int speed = 5;
|
||||
|
||||
ge_render.init_func(&ge_render, NULL);
|
||||
while (1) {
|
||||
input_btn_func(&ge_input);
|
||||
while (ge_input.func_recv(&ge_input, &ievent) == 0) {
|
||||
switch (ievent.num) {
|
||||
case GE_ITYPE_KEY_1:
|
||||
player.pos.x += speed;
|
||||
break;
|
||||
case GE_ITYPE_KEY_2:
|
||||
player.pos.y -= speed;
|
||||
break;
|
||||
case GE_ITYPE_KEY_3:
|
||||
player.pos.y += speed;
|
||||
break;
|
||||
case GE_ITYPE_KEY_4:
|
||||
player.pos.x -= speed;
|
||||
break;
|
||||
default:
|
||||
LOG_INFO("%d pressd", ievent.num);
|
||||
break;
|
||||
}
|
||||
}
|
||||
ge_render.func_draw_rect(&ge_render, &(ge_render_rect_t) {
|
||||
.pos = {0, 0},
|
||||
.size = ge_render.screen_size
|
||||
}, WHITE);
|
||||
ge_render.func_draw_rect(&ge_render, &player, RED);
|
||||
ge_render.func_flush(&ge_render);
|
||||
OSTimeDlyHMSM(0, 0, 0, 33);
|
||||
}
|
||||
}
|
||||
|
||||
void start_task(void *args) {
|
||||
(void)args;
|
||||
OS_CPU_SR cpu_sr=0;
|
||||
OS_ENTER_CRITICAL();
|
||||
CREATE_TASK(game_main, NULL, 4, 9);
|
||||
CREATE_TASK(T_ledR, NULL, 1, 5);
|
||||
CREATE_TASK(T_ledG, NULL, 2, 6);
|
||||
CREATE_TASK(T_ledB, NULL, 3, 7);
|
||||
OSTaskSuspend(10);
|
||||
OS_EXIT_CRITICAL();
|
||||
}
|
||||
|
||||
/* USER CODE END 0 */
|
||||
|
||||
@ -101,52 +202,17 @@ int main(void)
|
||||
MX_GPIO_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
INIT_LOGGER();
|
||||
ge_render.init_func(&ge_render, 0);
|
||||
ge_render_rect_t full_screen_rect = {
|
||||
.pos.x = 0,
|
||||
.pos.y = 0,
|
||||
.size = ge_render.screen_size,
|
||||
};
|
||||
ge_render.func_draw_rect(&ge_render, &full_screen_rect, WHITE);
|
||||
// Assert(0);
|
||||
OSInit();
|
||||
OSTaskCreate(start_task,(void *)0, GET_STACK_TOP(0), 10);//创建起始任务
|
||||
OSStart();
|
||||
// Never come here
|
||||
Error_Handler();
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
/* USER CODE BEGIN WHILE */
|
||||
ge_input_event_t ievent;
|
||||
ge_render_rect_t player = {
|
||||
.pos.x = 0,
|
||||
.pos.y = 0,
|
||||
.size.x = 10,
|
||||
.size.y = 10,
|
||||
};
|
||||
int speed = 5;
|
||||
while (1)
|
||||
{
|
||||
input_btn_func(&ge_input);
|
||||
while (ge_input.func_recv(&ge_input, &ievent) == 0) {
|
||||
switch (ievent.num) {
|
||||
case GE_ITYPE_KEY_1:
|
||||
player.pos.x += speed;
|
||||
break;
|
||||
case GE_ITYPE_KEY_2:
|
||||
player.pos.y -= speed;
|
||||
break;
|
||||
case GE_ITYPE_KEY_3:
|
||||
player.pos.y += speed;
|
||||
break;
|
||||
case GE_ITYPE_KEY_4:
|
||||
player.pos.x -= speed;
|
||||
break;
|
||||
default:
|
||||
LOG_INFO("%d pressd", ievent.num);
|
||||
break;
|
||||
}
|
||||
}
|
||||
ge_render.func_draw_rect(&ge_render, &full_screen_rect, WHITE);
|
||||
ge_render.func_draw_rect(&ge_render, &player, RED);
|
||||
ge_render.func_flush(&ge_render);
|
||||
HAL_Delay(33); // 去抖动延时
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
/* USER CODE BEGIN 3 */
|
||||
|
Reference in New Issue
Block a user