RT-Thread定时器以及结构体指针的一些思考
定时器分为软件定时器和硬件定时器。顾名思义,软件定时器就是有操作系统提供的软件定时器,硬件定时器就是用硬件芯片提供的定时器。
而在RT-Thread操作系统提供的定时器是软件定时器,但是为了便于管理,也分了硬件定时器和软件定时器(都属于上面的软件定时器)。
RT-Thread中的HARD_TIMER与SOFT_TIMER最大区别就是指向超时函数的执行位置不同,HARD_TIMER超时函数在中断上下文环境中执行,SOFT_TIMER超时函数在定时器线程上下文中执行。
下面代码将会创建两个静态定时器单次触发和周期触发
static struct rt_timer timer1; // 加上static限定只能在本文件
static struct rt_timer timer2;
static int cnt = 0; static void timer_out1(void *parameter)
{
rt_kprintf("periodic timer is timeout %d\n", cnt);
if(cnt++ >= 9)
{
rt_timer_stop(&timer1);
rt_kprintf("periodic timer was stop!\n");
}
} static void timer_out2(void *parameter)
{
rt_kprintf("one shot timer was stop!\n"); } static void timer_sample4(void) //加上void,养成好的代码习惯
{
rt_timer_init(&timer1, "timer1", timer_out1, RT_NULL, 10, RT_TIMER_FLAG_PERIODIC);
rt_timer_start(&timer1);
rt_timer_init(&timer2, "timer2", timer_out2, RT_NULL, 30, RT_TIMER_FLAG_ONE_SHOT);
rt_timer_start(&timer2);
}
MSH_CMD_EXPORT(timer_sample4, timer_active);
此时仿真时能够正常执行,但是下面这个代码会报错。
static rt_timer_t timer1; // 加上static限定只能在本文件
static rt_timer_t timer2;
static int cnt = 0; static void timer_out1(void *parameter)
{
rt_kprintf("periodic timer is timeout %d\n", cnt);
if(cnt++ >= 9)
{
rt_timer_stop(timer1);
rt_kprintf("periodic timer was stop!\n");
}
} static void timer_out2(void *parameter)
{
rt_kprintf("one shot timer was stop!\n"); } static void timer_sample4(void) //加上void,养成好的代码习惯
{
rt_timer_init(timer1, "timer1", timer_out1, RT_NULL, 10, RT_TIMER_FLAG_PERIODIC);
rt_timer_start(timer1);
rt_timer_init(timer2, "timer2", timer_out2, RT_NULL, 30, RT_TIMER_FLAG_ONE_SHOT);
rt_timer_start(timer2);
}
MSH_CMD_EXPORT(timer_sample4, timer_active);
我猜想是因为结构体指针不是一个对象,只是一个能够指向结构体对象的指针。后来用下面这段代码进行了测试,验证猜想正确。
static struct rt_timer timer1; // 加上static限定只能在本文件
static struct rt_timer timer2;
static rt_timer_t timer3; // 加上static限定只能在本文件
static rt_timer_t timer4;
static int cnt = 0; static void timer_out1(void *parameter)
{
rt_kprintf("periodic timer is timeout %d\n", cnt);
if(cnt++ >= 9)
{
rt_timer_stop(&timer1);
rt_kprintf("periodic timer was stop!\n");
}
} static void timer_out2(void *parameter)
{
rt_kprintf("one shot timer was stop!\n"); } static void timer_sample4(void) //加上void,养成好的代码习惯
{
timer3 = &timer1;
timer4 = &timer2;
rt_timer_init(timer3, "timer1", timer_out1, RT_NULL, 10, RT_TIMER_FLAG_PERIODIC);
rt_timer_start(&timer1);
rt_timer_init(timer4, "timer2", timer_out2, RT_NULL, 30, RT_TIMER_FLAG_ONE_SHOT);
rt_timer_start(&timer2);
}
MSH_CMD_EXPORT(timer_sample4, timer_active);
如果有错误,欢迎在评论区指正。
RT-Thread定时器以及结构体指针的一些思考的更多相关文章
- C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...
- ctypes 操作 python 与 c++ dll 互传结构体指针
CMakeLists.txt # project(工程名) project(blog-3123958139-1) # add_library(链接库名称 SHARED 链接库代码) add_libra ...
- python 传递结构体指针到 c++ dll
CMakeLists.txt # project(工程名) project(xxx) # add_library(链接库名称 SHARED 链接库代码) add_library(xxx SHARED ...
- 【C语言入门教程】7.3 结构体指针的定义和引用
C 语言中指针的操作非常灵活,它也能指向结构体变量对结构体变量进行操作.在学习结构指针之前,需要再次加深对指针的认识.声明指针变量时所使用的数据类型修饰符实际上的作用是定义指针访问内存的范围,如果指针 ...
- Delphi 中的结构体与结构体指针
好多程序都给结构体变量设定了一个结构体指针 例如: PAbc = ^TAbc; TAbc = record a: string[10]; b: string[5]; c: string[1]; end ...
- (三)结构体指针、sizeof
(一)结构体指针定义 今天上班写了一段测试代码,结果在linux下编译出现段错误,刚开始一直找不到原因,后来找了度娘才搞懂了.我先贴出来第一次写的代码以及gcc编译器下报的错误: #include&l ...
- c语言结构体指针初始化
今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...
- c语言中的结构体指针类型的cast
1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针, ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
随机推荐
- WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探
原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探 最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感 ...
- wpf 绑定数据无法更新ui控件可能存在的问题
BindingMode的枚举值有: ① OneWay ② TwoWay ③ OneTime:根据源端属性值设置目标属性值,之后的改变会被忽略,除非调用BindingExpression.UpdateT ...
- WPF中ItemsControl应用虚拟化时找到子元素的方法
原文:WPF中ItemsControl应用虚拟化时找到子元素的方法 wpf的虚拟化技术会使UI的控件只初始化看的到的子元素, 而不是所有子元素都被初始化,这样会提高UI性能. 但是我们经常会遇到一个 ...
- 【C#】WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的
原文:[C#]WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的 初学WPF,知道一些控件可以通过定义Style的Trigger改变要显示的样式,但是 ...
- jquery 克隆div 复制div 克隆元素 复制元素
代码: $('.div1').clone() 定义和用法 clone() 方法生成被选元素的副本,包含子节点.文本和属性. 语法 $(selector).clone(includeEvents) 参数 ...
- 在 __CC_ARM 编译器环境下,使用$Sub$$ 与 $Super$$ 的“补丁”功能
$Sub$$ 与 $Super$$ 的“补丁”功能(详见 ARM® Compiler v5.06 for µVision® armlink User Guide): 这是一种特殊模式:用于有一个已经存 ...
- 使用BGP的虚拟下一跳实现IGP的路由负载
网络拓扑: XRV1 ============================================================== !hostname XRV1! interface ...
- Android零基础入门第50节:StackView卡片堆叠
原文:Android零基础入门第50节:StackView卡片堆叠 上一期学习了AdapterViewFilpper的使用,你已经掌握了吗?本期开始学习StackView的使用. 一.认识StackV ...
- 反射:获取枚举类型的Name,Value,Description
[Obsolete("请使用新的方法XXX")] //使用Obsolete特性来告诉使用者这是一个过期的方法 private static void Test() { Type t ...
- redis的简介和使用
简介 redis(Remote Dictionary Server)是一种Nosql技术,它是一个开源的高级kv存储和数据结构存储系统,它经常被拿来和Memcached相比较,但是Memcached不 ...