0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于RK3568的内部定时器应用示例

武汉万象奥科 2023-11-09 17:03 次阅读

1. 内部定时器介绍

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

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

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

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

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

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

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

3568

2. 驱动示例代码

RK3568蜂鸣器定时鸣叫:

#include

#include

#include

#include

#include

#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");

3. 内部定时器验证

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


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 定时器
    +关注

    关注

    23

    文章

    3236

    浏览量

    114413
  • 嵌入式硬件
    +关注

    关注

    1

    文章

    923

    浏览量

    8202
  • RK3568
    +关注

    关注

    4

    文章

    492

    浏览量

    4912
收藏 人收藏

    评论

    相关推荐

    瑞芯微RK3568 USB驱动

    瑞芯微RK3568 USB驱动程序
    发表于 11-11 14:18 0次下载

    RK3568烧录工具

    RK3568 烧录工具
    发表于 11-11 14:16 0次下载

    RK3568开发板支持AMP双系统

    RK3568开发板支持AMP双系统
    的头像 发表于 06-04 15:33 621次阅读
    <b class='flag-5'>RK3568</b>开发板支持AMP双系统

    基于HD-RK3568-CORE设计的HD-RK3568-OPS主板上新!

    HD-RK3568-OPS主板基于HD-RK3568-CORE 工业级核心板设计,支持标准OPS接口,具有即插即用、操作简单的特点,适用于数字标牌、自助终端、教育一体机等应用场景。
    的头像 发表于 04-19 18:08 1000次阅读
    基于HD-<b class='flag-5'>RK3568</b>-CORE设计的HD-<b class='flag-5'>RK3568</b>-OPS主板上新!

    支持标准OPS接口,通用型RK3568工控板上新!

    HD-RK3568-OPS主板基于HD-RK3568-CORE 工业级核心板设计,搭载1.8GHz主频的高性能ARM处理,适用于工业现场应用需求。
    的头像 发表于 04-17 11:32 547次阅读
    支持标准OPS接口,通用型<b class='flag-5'>RK3568</b>工控板上新!

    RK3568-GDB程序调试方法说明

    RK3568-GDB程序调试方法说明
    的头像 发表于 01-19 16:16 1709次阅读
    <b class='flag-5'>RK3568</b>-GDB程序调试方法说明

    RK3568-MQTT通信协议案例

    RK3568-MQTT通信协议案例
    的头像 发表于 01-19 15:31 1728次阅读
    <b class='flag-5'>RK3568</b>-MQTT通信协议案例

    RK3568-IgH EtherCAT主站开发案例

    RK3568-IgH EtherCAT主站开发案例
    的头像 发表于 01-19 15:20 1663次阅读
    <b class='flag-5'>RK3568</b>-IgH EtherCAT主站开发案例

    RK3568--Acontis EtherCAT主站开发案例

    RK3568--Acontis EtherCAT主站开发案例
    的头像 发表于 01-19 14:59 742次阅读
    <b class='flag-5'>RK3568</b>--Acontis EtherCAT主站开发案例

    RK3568--系统启动阶段LOGO显示

    RK3568--系统启动阶段LOGO显示
    的头像 发表于 01-19 14:44 988次阅读
    <b class='flag-5'>RK3568</b>--系统启动阶段LOGO显示

    RK3568---NPU开发案例

    RK3568---NPU开发案例
    的头像 发表于 01-19 13:50 826次阅读
    <b class='flag-5'>RK3568</b>---NPU开发案例

    RK3568-ISP图像处理开发案例

    RK3568-ISP图像处理开发案例
    的头像 发表于 01-19 11:46 947次阅读
    <b class='flag-5'>RK3568</b>-ISP图像处理开发案例

    RK3568-ARM+FPGA通信案例开发手册 (一)

    RK3568-ARM+FPGA通信案例开发手册 (一)
    的头像 发表于 01-19 10:31 1006次阅读
    <b class='flag-5'>RK3568</b>-ARM+FPGA通信案例开发手册 (一)

    RK3568--基于AMP的多通道AD采集开发案

    RK3568--基于AMP的多通道AD采集开发案
    的头像 发表于 01-19 10:03 885次阅读
    <b class='flag-5'>RK3568</b>--基于AMP的多通道AD采集开发案

    RK3568-视频开发案例

    RK3568-视频开发案例
    的头像 发表于 01-18 15:51 793次阅读
    <b class='flag-5'>RK3568</b>-视频开发案例