OpenEdv-开源电子网

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

ucosii单个任务可以运行,多个任务无法运行

[复制链接]

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-3-3
在线时间
15 小时
发表于 2016-4-21 10:45:07 | 显示全部楼层 |阅读模式
1金钱
这是主函数
#include "includes.h"
/************************优先级定义**************************************/
/*#define task_start_prio      12*/
#define task_led_reset_prio   13
#define task_led_set_prio   14
/**********************堆栈大小定义**************************************/
#define task_led_reset_stack_size   500
static  OS_STK  task_led_reset_stack[task_led_reset_stack_size];
#define task_led_set_stack_size   500
static  OS_STK  task_led_set_stack[task_led_set_stack_size];
/*
#define  task_start_stack_size     256u
static  OS_STK       task_start_stack[task_start_stack_size];
*/
/************************主函数******************************************/
int main(void)
{
    HAL_Init();
    gpio_init();
    BSP_Init();
    OSInit();
   /* OSTaskCreate(task_start,(void *)0,(OS_STK *)&task_start_stack[task_start_stack_size-1],task_start_prio);*/
    OSTaskCreate(task_led_set,(void *)0,(OS_STK *)&task_led_set_stack[task_led_set_stack_size-1],task_led_set_prio);
    OSTaskCreate(task_led_reset,(void *)0,(OS_STK *)&task_led_reset_stack[task_led_reset_stack_size-1],task_led_reset_prio);
    OSStart();   
}
/***********************初始化外设**************************************/
void gpio_init(void)
      {
            __HAL_RCC_GPIOC_CLK_ENABLE();
            GPIO_InitTypeDef  GPIO_Initstruct;
            GPIO_Initstruct.Mode=GPIO_MODE_OUTPUT_PP;
            GPIO_Initstruct.Pin=GPIO_PIN_13;
            GPIO_Initstruct.Pull=GPIO_PULLUP;
            GPIO_Initstruct.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
            HAL_GPIO_Init(GPIOC,&GPIO_Initstruct);
      }
/************************建立任务***************************************/
/*static  void  task_start (void *p_arg)
{
    (void)p_arg;
    OSTaskCreate(task_led_set,(void *)0,(OS_STK *)&task_led_set_stack[task_led_set_stack_size-1],task_led_set_prio);
    OSTaskCreate(task_led_reset,(void *)0,(OS_STK *)&task_led_reset_stack[task_led_reset_stack_size-1],task_led_reset_prio);
    while(1)
          {
            OSTimeDlyHMSM(1, 0,,0);
          }
    OSTimeDlyHMSM(1, 0,0,0);
}*/
void task_led_reset(void *p_arg)
    {
        (void)p_arg;
        while (1)
            {
                  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
                  OSTimeDlyHMSM(0, 0,1,0);
            }
    }
void task_led_set(void *p_arg)
    {
        (void)p_arg;
        while (1)
            {
                  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
                 OSTimeDlyHMSM(0, 0,1,0);
            }
    }
/**********************************************************************/






最佳答案

查看完整内容[请看2#楼]

出现现象的原因我已经解释了,可能讲的不够具体。 你用两个任务来做灯闪烁,你的两个任务在1s的延时到了之后就会运行优先级最高的任务(假设是灯亮),运行完之后会立即去运行优先级相对低的那个任务(假设是灯暗),然后又进入1s的延时,以此循环。那么你看到的现象永远是灯暗,因为灯还没来得及亮你就让它暗了。 看一点资料去理解一下使用RTOS系统的意义吧,你想控制一个灯以1s频率暗灭用一个任务就可以完成了为什么要用 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-4-21 10:45:08 | 显示全部楼层
hellcatembert 发表于 2016-4-21 11:21
我是想控制一个灯以1s频率暗灭,我建立了两个任务,一个亮,延时1s,一个是灭,延时1s,但是,现象是,总 ...

出现现象的原因我已经解释了,可能讲的不够具体。

你用两个任务来做灯闪烁,你的两个任务在1s的延时到了之后就会运行优先级最高的任务(假设是灯亮),运行完之后会立即去运行优先级相对低的那个任务(假设是灯暗),然后又进入1s的延时,以此循环。那么你看到的现象永远是灯暗,因为灯还没来得及亮你就让它暗了。

看一点资料去理解一下使用RTOS系统的意义吧,你想控制一个灯以1s频率暗灭用一个任务就可以完成了为什么要用两个任务?


回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-3-3
在线时间
15 小时
 楼主| 发表于 2016-4-21 10:45:57 | 显示全部楼层
而且每次都是执行低优先级的任务
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-4-21 11:02:28 | 显示全部楼层
不是多个任务无法运行,而是一个任务运行完之后马上又运行了第二个任务,你就没法看到现象了

如果是新手的话就先尝试在两个任务里操作两个灯以不同频率闪烁就可以了,你现在的程序我不太明白你的意图或者说你想实现的功能是什么。

回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-3-3
在线时间
15 小时
 楼主| 发表于 2016-4-21 11:21:32 | 显示全部楼层
特朗姆斯 发表于 2016-4-21 11:02
不是多个任务无法运行,而是一个任务运行完之后马上又运行了第二个任务,你就没法看到现象了

如果是新手 ...

我是想控制一个灯以1s频率暗灭,我建立了两个任务,一个亮,延时1s,一个是灭,延时1s,但是,现象是,总是运行低优先级的那个,因为,我更改,两个任务的优先级,有两个不同的现象,就是总是低优先级的运行
回复

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2016-3-3
在线时间
15 小时
 楼主| 发表于 2016-4-21 12:51:05 | 显示全部楼层
特朗姆斯 发表于 2016-4-21 11:31
出现现象的原因我已经解释了,可能讲的不够具体。

你用两个任务来做灯闪烁,你的两个任务在1s的延时到 ...

我也明白了,真的谢谢你
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12991
金钱
12991
注册时间
2012-11-26
在线时间
3789 小时
发表于 2016-4-21 13:15:16 | 显示全部楼层
hellcatembert 发表于 2016-4-21 12:51
我也明白了,真的谢谢你

你弄两个打印任务测试看下效果
学无止境
回复

使用道具 举报

307

主题

1427

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7875
金钱
7875
注册时间
2015-10-15
在线时间
2874 小时
发表于 2016-4-21 14:52:36 | 显示全部楼层
是的。楼上解释很清晰。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 23:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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