OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2830|回复: 0

请问这段代码中的OSSched()为什么没有作用?

[复制链接]

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2017-7-5
在线时间
23 小时
发表于 2020-8-19 20:02:46 | 显示全部楼层 |阅读模式
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()无法进行任务调度?


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 05:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表