OpenEdv-开源电子网

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

软件定时器 和 任务函数里的 传递参数到底怎么用??

[复制链接]

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-6-13
在线时间
10 小时
发表于 2017-6-29 11:27:05 | 显示全部楼层 |阅读模式
本帖最后由 976657271 于 2017-6-29 11:27 编辑

@正点原子 悬赏咋弄啊软件定时器 和 任务函数里的  传递参数到底怎么用???????
教程的例子
*******************************************************************************
//创建定时器1
        OSTmrCreate((OS_TMR                *)&tmr1,                //定时器1
                (CPU_CHAR        *)"tmr1",                //定时器名字
                (OS_TICK         )20,                        //20*10=200ms
                (OS_TICK         )100,          //100*10=1000ms
                (OS_OPT                 )OS_OPT_TMR_PERIODIC, //周期模式
                (OS_TMR_CALLBACK_PTR)tmr1_callback,//定时器1回调函数
                (void            *)0,                        //参数为0
                (OS_ERR            *)&err);                //返回的错误码                                       



//定时器1的回调函数
void tmr1_callback(void *p_tmr, void *p_arg)
{
        static u8 tmr1_num=0;
        LCD_ShowxNum(62,111,tmr1_num,3,16,0x80); //显示定时器1的执行次数
        LCD_Fill(6,131,114,313,lcd_discolor[tmr1_num%14]);//填充区域
        tmr1_num++;                //定时器1执行次数加1
}


*******************************************************************************




以下是我的错误程序。周期为1s的定时器,目的:在执行time个周期后,在回调函数里删除此定时器。如何将 变量time作为参数传到回调函数里?
   官方文档描述:pcallbackarg是一个参数(一个指针),当它被调用时,它被传递给回调函数。


********************************************************************************
u8 time;
time=60;
//创建定时器1
        OSTmrCreate(  (OS_TMR                *)&tmr1,                //定时器1
                (CPU_CHAR        *)"tmr1",                //定时器名字
                (OS_TICK         )0,                        //100*10=200ms
                (OS_TICK         )100,          //100*10=1000ms
                (OS_OPT                 )OS_OPT_TMR_PERIODIC, //周期模式
                (OS_TMR_CALLBACK_PTR)tmr1_callback,//定时器1回调函数
                (void            *)&time,                        //参数为0
                (OS_ERR            *)&err);                //返回的错误码                        



//定时器1的回调函数
void tmr1_callback(void *p_tmr,void *p_arg)
{
  static u8 tmr1_num=0;
        OS_ERR err;
        tmr1_num++;                //定时器1执行次数加1
        LCD_ShowxNum(62,111,tmr1_num,3,16,0x80); //显示定时器1的执行次数
        LCD_Fill(6,131,114,313,lcd_discolor[tmr1_num%14]);//填充区域
        if(tmr1_num==time)
        {
                LED0=1;
    OSTmrStop(&tmr1,OS_OPT_TMR_NONE,0,&err);        //在定时器1的回调函数里关闭定时器1,会产生回调函数还没执行完毕就强制结束了,
                                                          //若这里OSTmrStop()有自己的回调函数或者函数后面还有语句则不能成功执行。
  }
}


********************************************************************************



问题一:如何在回调函数里用这个参数。
问题二:软件定时器的回调函数里关闭此定时器有什么问题。
问题三:实现指定时间的倒计时,并在屏幕显示倒计时的时间。(类似手机倒计时的功能)还有什么其他办法?
          ( 这里想的是把软件定时器设置成周期模式(周期1s)。每次回调函数里显示调用次数
           单词模式如果倒计时60s。没法每隔1s显示倒计时的数字。)

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

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-6-29 11:39:31 | 显示全部楼层
定时器回调函数的参数p_arg就是你创建定时器的时候传递进来的参数!你要操作的是p_arg!!
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-6-13
在线时间
10 小时
 楼主| 发表于 2017-6-29 15:18:00 | 显示全部楼层
zuozhongkai 发表于 2017-6-29 11:39
定时器回调函数的参数p_arg就是你创建定时器的时候传递进来的参数!你要操作的是p_arg!!

那我是要写void tmr1_callback(void *p_tmr,void *p_arg){
tmr1_num=*p_arg}
}呢?   还是void tmr1_callback(void *p_tmr,&time){
tmr1_num=time }

这两种我都试过,好像都报错
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-2 02:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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