feat(os): 添加 uC/OS-II 实时操作系统支持

- 在项目中集成 uC/OS-II 源代码和配置文件
- 修改 CMakeLists.txt 以包含 uC/OS-II 相关路径和源文件
- 更新 main.c 以使用 uC/OS-II 创建任务和管理调度
- 移除原有的裸机程序结构,为使用操作系统做准备
This commit is contained in:
ZZY
2025-06-30 10:57:53 +08:00
parent d939449267
commit 301e094671
15 changed files with 1193 additions and 258 deletions

View File

@ -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 */