单片机ucos3实验2
·
单片机 :STM32F407
开发板:DMF407电机开发板
平台:keil V5.31
HSE 为8MHZ
HSI为16MHZ
一、任务内嵌信号量实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "Built-in Semaphore", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(44, 111, 200, 16, 16, "Task2 run 0 times", BLUE);
lcd_draw_rectangle(5, 110, 234, 314, BLACK);
lcd_draw_line(5, 130, 234, 130, BLACK);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 开始任务调度 */
OSStart(&err);
for (;;)
{
/* 不会进入这里 */
}
}
task
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 创建Task2 */
Task2Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK2_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task2Task_TCB,
(CPU_CHAR *)"task2",
(OS_TASK_PTR )task2,
(void *)0,
(OS_PRIO )TASK2_PRIO,
(CPU_STK *)Task2Task_STK,
(CPU_STK_SIZE )TASK2_STK_SIZE / 10,
(CPU_STK_SIZE )TASK2_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint8_t key;
OS_ERR err;
while (1)
{
key = key_scan(0);
switch (key)
{
case KEY0_PRES:
{
OSTaskSemPost( (OS_TCB *)&Task2Task_TCB,
(OS_OPT )OS_OPT_POST_NONE,
(OS_ERR *)&err);
break;
}
default:
{
break;
}
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
void task2(void *p_arg)
{
OS_ERR err;
uint32_t task2_num = 0;
while (1)
{
OSTaskSemPend( (OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
lcd_show_xnum(124, 111, ++task2_num, 3, 16, 0, BLUE);
lcd_fill(6, 131, 233, 313, lcd_discolor[task2_num % 11]);
}
}
测试结果

二、任务内嵌消息队列实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "Built-in MQ", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
lcd_draw_rectangle(5, 130, 234, 314, BLACK); /* 画矩形 */
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 开始任务调度 */
OSStart(&err);
for (;;)
{
/* 不会进入这里 */
}
}
task
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 创建Task2 */
Task2Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK2_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task2Task_TCB,
(CPU_CHAR *)"task2",
(OS_TASK_PTR )task2,
(void *)0,
(OS_PRIO )TASK2_PRIO,
(CPU_STK *)Task2Task_STK,
(CPU_STK_SIZE )TASK2_STK_SIZE / 10,
(CPU_STK_SIZE )TASK2_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint8_t key;
OS_ERR err;
while (1)
{
key = key_scan(0);
if (key != 0)
{
OSTaskQPost((OS_TCB *)&Task2Task_TCB,
(void *)&key,
(OS_MSG_SIZE)sizeof(key),
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR *)&err);
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
void task2(void *p_arg)
{
uint8_t *key;
OS_MSG_SIZE size;
OS_ERR err;
uint32_t task2_num = 0;
while (1)
{
key = (uint8_t *)OSTaskQPend( (OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_MSG_SIZE *)&size,
(CPU_TS *)0,
(OS_ERR *)&err);
switch (*key)
{
case KEY0_PRES:
{
lcd_fill(6, 131, 233, 313, lcd_discolor[++task2_num % 11]);
break;
}
case KEY1_PRES:
{
LED0_TOGGLE();
break;
}
default:
{
break;
}
}
}
}
测试结果

三、事件标志实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "uC/OS-III Flag", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
lcd_draw_rectangle(5, 130, 234, 314, BLACK); /* 画矩形 */
lcd_show_string(59, 110, 220, 16, 16, "Flags Value: 0", BLUE);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 开始任务调度 */
OSStart(&err);
for (;;)
{
/* 不会进入这里 */
}
}
task
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
/* 创建事件标志 */
OSFlagCreate( (OS_FLAG_GRP *)&flag,
(CPU_CHAR *)"flag",
(OS_FLAGS )0,
(OS_ERR *)&err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 创建Task2 */
Task2Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK2_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task2Task_TCB,
(CPU_CHAR *)"task2",
(OS_TASK_PTR )task2,
(void *)0,
(OS_PRIO )TASK2_PRIO,
(CPU_STK *)Task2Task_STK,
(CPU_STK_SIZE )TASK2_STK_SIZE / 10,
(CPU_STK_SIZE )TASK2_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 创建Task3 */
Task3Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK3_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task3Task_TCB,
(CPU_CHAR *)"task3",
(OS_TASK_PTR )task3,
(void *)0,
(OS_PRIO )TASK3_PRIO,
(CPU_STK *)Task3Task_STK,
(CPU_STK_SIZE )TASK3_STK_SIZE / 10,
(CPU_STK_SIZE )TASK3_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint8_t key;
OS_ERR err;
while (1)
{
key = key_scan(0);
switch (key)
{
case KEY0_PRES:
{
OSFlagPost( (OS_FLAG_GRP *)&flag,
(OS_FLAGS )FLAGBIT_0,
(OS_OPT )OS_OPT_POST_FLAG_SET,
(OS_ERR *)&err);
break;
}
case KEY1_PRES:
{
OSFlagPost( (OS_FLAG_GRP *)&flag,
(OS_FLAGS )FLAGBIT_1,
(OS_OPT )OS_OPT_POST_FLAG_SET,
(OS_ERR *)&err);
break;
}
default:
{
break;
}
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
void task2(void *p_arg)
{
uint32_t task2_num = 0;
OS_ERR err;
CPU_SR_ALLOC();
while (1)
{
OSFlagPend( (OS_FLAG_GRP *)&flag,
(OS_FLAGS )FLAGBIT_ALL,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_FLAG_SET_ALL |
OS_OPT_PEND_FLAG_CONSUME |
OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err);
CPU_CRITICAL_ENTER();
lcd_fill(6, 131, 233, 313, lcd_discolor[++task2_num % 11]);
CPU_CRITICAL_EXIT();
}
}
void task3(void *p_arg)
{
OS_FLAGS flags;
OS_ERR err;
CPU_SR_ALLOC();
while (1)
{
flags = flag.Flags;
CPU_CRITICAL_ENTER();
lcd_show_xnum(163, 110, flags, 1, 16, 0, BLUE);
CPU_CRITICAL_EXIT();
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
测试结果

四、软件定时器实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "uC/OS-III Timer", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
lcd_draw_rectangle(5, 110, 115, 314, BLACK);
lcd_draw_rectangle(125, 110, 234, 314, BLACK);
lcd_draw_line(5, 130, 115, 130, BLACK);
lcd_draw_line(125, 130, 234, 130, BLACK);
lcd_show_string(15, 111, 110, 16, 16, "Timer1: 000", BLUE);
lcd_show_string(135, 111, 110, 16, 16, "Timer2: 000", BLUE);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 开始任务调度 */
OSStart(&err);
for (;;)
{
/* 不会进入这里 */
}
}
task
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
/* 创建软件定时器1 */
OSTmrCreate((OS_TMR *)&Timer1,
(CPU_CHAR *)"Timer1",
(OS_TICK )10,
(OS_TICK )0,
(OS_OPT )OS_OPT_TMR_ONE_SHOT,
(OS_TMR_CALLBACK_PTR)timer_cb,
(void *)0,
(OS_ERR *)&err);
/* 创建软件定时器2 */
OSTmrCreate((OS_TMR *)&Timer2,
(CPU_CHAR *)"Timer2",
(OS_TICK )0,
(OS_TICK )10,
(OS_OPT )OS_OPT_TMR_PERIODIC,
(OS_TMR_CALLBACK_PTR)timer_cb,
(void *)0,
(OS_ERR *)&err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint8_t key;
OS_ERR err;
while (1)
{
key = key_scan(0);
switch (key)
{
case KEY0_PRES: /* 启动软件定时器 */
{
OSTmrStart(&Timer1, &err);
OSTmrStart(&Timer2, &err);
break;
}
case KEY1_PRES: /* 停止软件定时器 */
{
OSTmrStop(&Timer1, OS_OPT_TMR_NONE, NULL, &err);
OSTmrStop(&Timer2, OS_OPT_TMR_NONE, NULL, &err);
break;
}
default:
{
break;
}
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
void timer_cb(void *p_tmr, void *p_arg)
{
static uint32_t timer1_num = 0;
static uint32_t timer2_num = 0;
if (p_tmr == &Timer1)
{
lcd_fill(6, 131, 114, 313, lcd_discolor[++timer1_num % 11]); /* LCD区域刷新 */
lcd_show_xnum(79, 111, timer1_num, 3, 16, 0x80, BLUE); /* 显示定时器1超时次数 */
}
else if (p_tmr == &Timer2)
{
lcd_fill(126, 131, 233, 313, lcd_discolor[++timer2_num % 11]); /* LCD区域刷新 */
lcd_show_xnum(199, 111, timer2_num, 3, 16, 0x80, BLUE); /* 显示定时器2超时次数 */
}
else
{
/* 什么都不做 */
}
}
测试结果

五、时间戳实验‘
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "uC/OS-III TS", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
lcd_draw_rectangle(5, 110, 234, 314, BLACK);
lcd_draw_line(5, 130, 234, 130, BLACK);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 开始任务调度 */
OSStart(&err);
for (;;)
{
/* 不会进入这里 */
}
}
task
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint8_t key;
CPU_TS_TMR start_ts, end_ts, delta_ts;
CPU_INT64U delta_us;
uint32_t task1_num = 0;
OS_ERR err;
while (1)
{
key = key_scan(0);
switch (key)
{
case KEY0_PRES:
{
start_ts = OS_TS_GET();
lcd_fill(6, 131, 233, 313, lcd_discolor[++task1_num % 11]);
end_ts = OS_TS_GET();
delta_ts = end_ts - start_ts;
delta_us = CPU_TS32_to_uSec(delta_ts);
lcd_show_string(54, 111, 200, 16, 16, "Delta Us: us", BLUE);
lcd_show_num(134, 111, delta_us, 5, 16, BLUE);
}
default:
{
break;
}
}
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
测试结果

六、内存管理实验
主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */
uc_os3_demo(); /* 运行uC/OS-III例程 */
}
ucos3
void uc_os3_demo(void)
{
OS_ERR err;
lcd_show_string(10, 10, 220, 32, 32, "STM32", RED);
lcd_show_string(10, 47, 220, 24, 24, "Mem Manage", RED);
lcd_show_string(10, 76, 220, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(30, 118, 200, 16, 16, "Total Block Count:", RED);
lcd_show_string(30, 139, 200, 16, 16, "Free Block Count:", RED);
lcd_show_string(30, 160, 200, 16, 16, "Get Block Addr:", RED);
/* 初始化uC/OS-III */
OSInit(&err);
/* 创建Start Task */
OSTaskCreate( (OS_TCB *)&StartTask_TCB,
(CPU_CHAR *)"start_task",
(OS_TASK_PTR )start_task,
(void *)0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK *)StartTask_STK,
(CPU_STK_SIZE )START_STK_SIZE / 10,
(CPU_STK_SIZE )START_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 开始任务调度 */
OSStart(&err);
for (;;)
{
/* 不会进入这里 */
}
}
task
void start_task(void *p_arg)
{
OS_ERR err;
CPU_INT32U cnts;
/* 初始化CPU库 */
CPU_Init();
/* 根据配置的节拍频率配置SysTick */
cnts = (CPU_INT32U)(HAL_RCC_GetSysClockFreq() / OSCfg_TickRate_Hz);
OS_CPU_SysTickInit(cnts);
/* 开启时间片调度,时间片设为默认值 */
OSSchedRoundRobinCfg(OS_TRUE, 0, &err);
/* 创建由uC/OS-III管理的内存 */
OSMemCreate((OS_MEM *)&mem,
(CPU_CHAR *)"mem",
(void *)memory,
(OS_MEM_QTY)MEM_BLOCK_CNT,
(OS_MEM_SIZE)MEM_BLOCK_SIZE,
(OS_ERR *)&err);
/* 创建Task1 */
Task1Task_STK = (CPU_STK *)mymalloc(SRAMIN, TASK1_STK_SIZE * sizeof(CPU_STK));
OSTaskCreate( (OS_TCB *)&Task1Task_TCB,
(CPU_CHAR *)"task1",
(OS_TASK_PTR )task1,
(void *)0,
(OS_PRIO )TASK1_PRIO,
(CPU_STK *)Task1Task_STK,
(CPU_STK_SIZE )TASK1_STK_SIZE / 10,
(CPU_STK_SIZE )TASK1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
/* 删除Start Task */
OSTaskDel((OS_TCB *)0, &err);
}
void task1(void *p_arg)
{
uint8_t key;
OS_ERR err;
uint8_t *buf = NULL;
while (1)
{
key = key_scan(0);
switch (key)
{
case KEY0_PRES:
{
buf = OSMemGet( (OS_MEM *)&mem,
(OS_ERR *)&err);
if (buf != NULL)
{
sprintf((char *)buf, "0x%p", buf);
lcd_show_string(158, 160, 200, 16, 16, (char *)buf, BLUE);
}
else
{
lcd_show_string(158, 160, 200, 16, 16, " ", RED);
lcd_show_string(158, 160, 200, 16, 16, "Failed!", RED);
}
break;
}
case KEY1_PRES:
{
if (buf != NULL)
{
OSMemPut( (OS_MEM *)&mem,
(void *)buf,
(OS_ERR *)&err);
buf = NULL;
}
break;
}
default:
{
break;
}
}
lcd_show_xnum(182, 118, mem.NbrMax, 1, 16, 0, BLUE);
lcd_show_xnum(182, 139, mem.NbrFree, 1, 16, 0, BLUE);
OSTimeDly(10, OS_OPT_TIME_DLY, &err);
}
}
测试结果

更多推荐
所有评论(0)