广州佩特电子科技有限公司

示例图片三
网站首页 > 新闻资讯 > 业界资讯

佩特科技分享一个基于RK3568开发板的内部定时器应用示例

2023-12-09 16:52:16 广州佩特电子科技有限公司 已读

今天佩特科技和大家分享基于RK3568开发板的内部定时器应用示例。


QQ截图20231209165432.png


一、内部定时器介绍


内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于kernel/linux/timer.h和kernel/timer.c 文件中。


被调度的函数肯定是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中,所以调度函数必须遵守以下规则:


1、没有 current 指针、不允许访问用户空间。因为没有进程上下文,相关代码和被中断的进程没有任何联系。


2、不能执行休眠(或可能引起休眠的函数)和调度。


3、任何被访问的数据结构都应该针对并发访问进行保护,以防止竞争条件。


内核定时器的调度函数运行过一次后就不会再被运行了(相当于自动注销),但可以通过在被调度的函数中重新调度自己来周期运行。


在SMP系统中,调度函数总是在注册它的同一CPU上运行,以尽可能获得缓存的局域性。


二、 驱动示例代码


RK3568蜂鸣器定时鸣叫:


#include<linux/init.h>


#include<linux/module.h>


#include<linux/gpio.h>


#include<linux/interrupt.h>


#include<linux/timer.h>



#defineGPIO_PIN 15 // 替换为你的GPIO引脚


staticstruct timer_list timer;


intgpio_status = 1;



// 定时器中断处理函数


staticvoid timer_callback(struct timer_list *t) {


gpio_set_value(GPIO_PIN ,gpio_status);


gpio_status = ! gpio_status;


mod_timer(&timer, jiffies +msecs_to_jiffies(1000)); // 1秒后再次触发定时器


}



staticint __init mymodule_init(void) {


int ret;


// 请求GPIO


ret = gpio_request(GPIO_PIN,"my_gpio");


if (ret) {


printk("无法请求GPIO %d\n",GPIO_PIN);


return ret;


}



// 配置GPIO引脚为输出


gpio_direction_output(GPIO_PIN, 0);



// 初始化定时器


timer_setup(&timer, timer_callback, 0);


mod_timer(&timer, jiffies +msecs_to_jiffies(2000)); // 2秒后触发定时器


return 0;


}


staticvoid __exit mymodule_exit(void) {


// 删除定时器


del_timer_sync(&timer);


// 释放GPIO


gpio_free(GPIO_PIN);


}



module_init(mymodule_init);


module_exit(mymodule_exit);



MODULE_LICENSE("GPL");


MODULE_AUTHOR("zou");


MODULE_DESCRIPTION("SampleGPIO and Timer Interrupt Kernel Module");


三、内部定时器验证


将驱动编译成模块并insmod(加载)模块后,等待2秒后蜂鸣器开始以1s时间间隔鸣叫。


佩特科技是广州地区知名的嵌入式方案研发公司,主打产品为多款嵌入式核心板主板,如全志A133_全志A40i_全志D1-H开发板核心板,瑞芯微RK3288核心板开发板等等。佩特科技不仅研发技术先进,批量出货能力强大,也提供嵌入式芯片方案定制,欢迎咨询洽谈。


Powered by MetInfo 5.3.18 ©2008-2023 www.metinfo.cn