Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
定时器
RTT中的定时器的超时函数中连续调用rt_tick_get(); 滴答计数值不变
发布于 2020-12-10 16:56:09 浏览:2531
订阅该版
麻烦有兴趣的朋友帮忙解答一下,万分感谢! 以下程序是通过一个定时器周期性发送一个信号量触发一下线程的程序。 目前我遇到的问题是在线程中连续调用rt_tick_get(),发现滴答计数值是随时间增加的,而在软件定时器的超时函数中调用rt_tick_get()获取滴答计数值则是静止的。硬件定时器也是同样的结果。望大家帮忙分析一下原因。谢谢! ```c `/* ************************************************************************* * 包含的头文件 ************************************************************************* */ #include "board.h" #include "rtthread.h" /* ****************************************************************** * 变量 ****************************************************************** */ /* 定义线线程、软件定时器制块 */ static rt_timer_t swtmr1 = RT_NULL; static struct rt_thread led1_thread; /*定义信号量控制块*/ rt_sem_t test_sem = RT_NULL; /* 定义线程控栈时要求RT_ALIGN_SIZE个字节对齐 */ ALIGN(RT_ALIGN_SIZE) /* 定义线程栈 */ static rt_uint8_t rt_led1_thread_stack[1024]; /************************* 全局变量声明 ****************************/ static uint32_t TmrCb_Count1 = 0; /* ************************************************************************* * 函数声明 ************************************************************************* */ static void swtmr1_callback(void* parameter); static void led1_thread_entry(void* parameter); /* ************************************************************************* * main 函数 ************************************************************************* */ int main(void) { test_sem = rt_sem_create("test_sem",/*信号量名字*/ 0, /*信号量初始值,默认有一个信号量*/ RT_IPC_FLAG_FIFO);/*信号量模式*/ if (test_sem != RT_NULL) rt_kprintf("信号量创建成功!\n\n"); /*创建线程*/ rt_thread_init(&led1_thread, /* 线程控制块 */ "led1", /* 线程名字 */ led1_thread_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数参数 */ &rt_led1_thread_stack[0], /* 线程栈起始地址 */ sizeof(rt_led1_thread_stack), /* 线程栈大小 */ 3, /* 线程的优先级 */ 20); /* 线程时间片 */ rt_thread_startup(&led1_thread); /* 启动线程,开启调度 */ /* 创建一个软件定时器 */ swtmr1 = rt_timer_create("swtmr1_callback", /* 软件定时器的名称 */ swtmr1_callback,/* 软件定时器的回调函数 */ 0, /* 定时器超时函数的入口参数 */ 100, /* 软件定时器的超时时间(周期回调时间) */ RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER); /* 软件定时器模式 周期模式 */ /* 启动定时器 */ if (swtmr1 != RT_NULL) rt_timer_start(swtmr1); } /* ************************************************************************* * 线程定义 ************************************************************************* */ static void led1_thread_entry(void* parameter) { while (1) { rt_err_t uwRet = RT_EOK; uwRet = rt_sem_take(test_sem, /*获取信号量*/ RT_WAITING_FOREVER); /*等待时间,一直等*/ if (RT_EOK == uwRet){ rt_kprintf ("任务完成!\n\n"); } rt_kprintf("线程获取滴答1=%d\n", rt_tick_get()); rt_kprintf("线程获取滴答2=%d\n", rt_tick_get()); rt_kprintf("线程获取滴答3=%d\n", rt_tick_get()); } } /*定时器超时函数*/ static void swtmr1_callback(void* parameter) { uint32_t tick_num1; rt_err_t uwRet = RT_EOK; TmrCb_Count1++; /* 每回调一次加一 */ uwRet = rt_sem_release(test_sem); if (RT_EOK == uwRet) rt_kprintf ("信号量释放成功!\n\n"); else rt_kprintf ("信号量无法释放!\n\n"); tick_num1 = (uint32_t)rt_tick_get(); /* 获取滴答定时器的计数值 */ rt_kprintf("swtmr1_callback函数执行 %d 次\n", TmrCb_Count1); rt_kprintf("定时器获取滴答值1=%d\n", (uint32_t)rt_tick_get()); rt_kprintf("定时器获取滴答值2=%d\n", (uint32_t)rt_tick_get()); rt_kprintf("定时器获取滴答值3=%d\n", (uint32_t)rt_tick_get()); rt_kprintf("定时器获取滴答值4=%d\n", (uint32_t)rt_tick_get()); } /********************************END OF FILE****************************/` ``` ![image.png](/uploads/20201210/654a685b2de26d375a376451618b6f7e.png)
查看更多
张世争
2020-12-10
学以致用
这样测试,意义不大。 * swtmr1_callback 也是线程环境, timer线程,可以list_thread看下。 * rt_kprintf 打印 是异步的, * 你是假设每次打印都有延时,所以tick会变。实际上, 4个 rt_tick_get,可能一起获取。 * 只是后面,依次打印。
3
个回答
默认排序
按发布时间排序
wenbodong
2020-12-10
这家伙很懒,什么也没写!
你开启了软件定时器的功能吗,看看有没有这个宏RT_USING_TIMER_SOFT
XIAO ER
2022-11-08
这家伙很懒,什么也没写!
解决了吗?同样问题
撰写答案
登录
注册新账号
关注者
0
被浏览
2.5k
关于作者
张大师_bin
这家伙很懒,什么也没写!
提问
6
回答
2
被采纳
0
关注TA
发私信
相关问题
1
定时器中要延时,用什么办法?
2
cubemx配置定时器PWM可以输出移到RT_stdio不能输出?
3
对源码中优先级处理和定时器的两个疑问?
4
关于定时器时钟,怎么定时一个1MHz时钟
5
rt_spi_send、rt_spi_recv不能放在定时器里进行使用
6
关闭定时器中断,再开启中断
7
关于在L4潘多拉上定时器TIM3跑hwtimer_sample例程出错的问题
8
rtthread studio里定时器倍频问题
9
rt-thread-studio开发潘多拉的定时器出现问题?
10
多个软件定时器之间会不会冲突
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
如何在master上的BSP中添加配置yml文件
2
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
3
RT-Thread 发布 EtherKit开源以太网硬件!
4
rt-thread使用cherryusb实现虚拟串口
5
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
14
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部