初级会员

- 积分
- 80
- 金钱
- 80
- 注册时间
- 2017-7-5
- 在线时间
- 23 小时
|
2金钱
本帖最后由 STM1928 于 2020-8-19 21:16 编辑
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "includes.h"
#define START_TASK_PRIO 3
#define START_STK_SIZE 128
OS_TCB StartTaskTCB;
CPU_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *);
#define TASK1_TASK_PRIO 4
#define TASK1_STK_SIZE 128
OS_TCB Task1_TaskTCB;
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1_task(void *);
#define TASK2_TASK_PRIO 5
#define TASK2_STK_SIZE 128
OS_TCB Task2_TaskTCB;
CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
void task2_task(void *);
void delay(uint32_t);
int main(void)
{
OS_ERR err;
CPU_SR_ALLOC();
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
OSInit(&err);
OS_CRITICAL_ENTER();
OSTaskCreate((OS_TCB * )&StartTaskTCB,
(CPU_CHAR * )"start task",
(OS_TASK_PTR )start_task,
(void * )0,
(OS_PRIO )START_TASK_PRIO,
(CPU_STK * )&START_TASK_STK[0],
(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);
OS_CRITICAL_EXIT();
OSStart(&err);
}
void start_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err);
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN
CPU_IntDisMeasMaxCurReset();
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN
OSSchedRoundRobinCfg(DEF_ENABLED, 1, &err);
#endif
OS_CRITICAL_ENTER();
OSTaskCreate((OS_TCB * )&Task1_TaskTCB,
(CPU_CHAR * )"Task1 task",
(OS_TASK_PTR )task1_task,
(void * )0,
(OS_PRIO )TASK1_TASK_PRIO,
(CPU_STK * )&TASK1_TASK_STK[0],
(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);
OSTaskCreate((OS_TCB * )&Task2_TaskTCB,
(CPU_CHAR * )"task2 task",
(OS_TASK_PTR )task2_task,
(void * )0,
(OS_PRIO )TASK2_TASK_PRIO,
(CPU_STK * )&TASK2_TASK_STK[0],
(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);
OS_CRITICAL_EXIT();
OSTaskDel((OS_TCB*)0, &err);
}
void task1_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while (1) {
LED0 = 0;
delay(5000000);
LED0 = 1;
delay(5000000);
OSSched();
}
}
void task2_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while (1) {
LED1 = 0;
delay(5000000);
LED1 = 1;
delay(5000000);
OSSched();
}
}
void delay(uint32_t cnt)
{
for (; cnt > 0; cnt--);
}
创建两个任务task1、task2,首先task1先将LED0点亮;延时后再将LED0熄灭;再次延时后通过OSSched()切换至task2(同时挂起task1)。task2先将LED1点亮;延时后再将LED1熄灭;再次延时后再次OSSched()切换回task1(同时挂起task2),重复上述步骤。但是在板上实际运行结果是仅LED0在闪烁,LED1一直不亮,表明OSSched()没有正常切换任务。但若不用自定义函数delay而是用系统自带的延时函数delay_ms,则delay_ms因带有delay_ostimedly,可触发任务调度,无需再用OSSched(),例如如果都是延时1000ms,则实验效果是LED0、LED1同步闪烁亮1s、灭1s。那么为什么上述代码中手动添加的OSSched()无法进行任务调度?
|
|