当前位置: 首页 > news >正文

郑州港区建设投资公司网站如何进行网站性能优化?

郑州港区建设投资公司网站,如何进行网站性能优化?,wordpress 企业网站,网站制作联系在申请 GPIO 中断时使用 request_irq,但是request_irq绑定的中断服务程序指的是中断上文。在 Linux 内核中,tasklet 是一种特殊的软中断机制,被广泛用于处理中断下文相关的任务。它是一种常见且有效的方法,在多核处理系统上可以避免并发问题。…

  在申请 GPIO 中断时使用 request_irq,但是request_irq绑定的中断服务程序指的是中断上文。在 Linux 内核中,tasklet 是一种特殊的软中断机制,被广泛用于处理中断下文相关的任务。它是一种常见且有效的方法,在多核处理系统上可以避免并发问题。Tasklet 绑定的函数在同一时间只能在一个 CPU 上运行,因此不会出现并发冲突。然而,需要注意的是,tasklet 绑定的函数中不能调用可能导致休眠的函数,否则可能引起内核异常。
  在 Linux 内核中,tasklet 结构体的定义位于 include/linux/interrupt.h 头文件中。其原型如下:

struct tasklet_struct
{struct tasklet_struct *next;unsigned long state;atomic_t count;void (*func)(unsigned long);unsigned long data;
};

  tasklet_struct 结构体包含以下成员:
  next:指向下一个tasklet的指针,用于形成链表结构,以便内核中可以同时管理多个tasklet。
   state:表示 tasklet 的当前状态。
  count:用于引用计数,用于确保 tasklet 在多个地方调度或取消调度时的正确处理。
   func:指向 tasklet 绑定的函数的指针,该函数将在 tasklet 执行时被调用。
  data:传递给 tasklet 绑定函数的参数

一、tasklet 相关接口函数

1.1、静态初始化函数

  在 Linux 内核中,有一个用于静态初始化 tasklet 的宏函数:DECLARE_TASKLET。这个宏函数可以帮助我们更方便地进行 tasklet 的静态初始化。宏函数的原型如下:

#define DECLARE_TASKLET(name,func,data) \
struct tasklet_struct name = { NULL,0,ATOMIC_INIT(0),func,data}

  其中,name 是 tasklet 的名称,func 是 tasklet 的处理函数,data 是传递给处理函数的参数。初始化状态为使能状态。
  如果 tasklet 初始化函数为非使能状态,使用以下宏定义:

#define DECLARE_TASKLET_DISABLED(name,func,data) \
struct tasklet_struct name = { NULL,0,ATOMIC_INIT(1),func,data}

  其中,name 是 tasklet 的名称,func 是 tasklet 的处理函数,data 是传递给处理函数的参数。初始化状态为非使能状态。

1.2、动态初始化函数

  在 Linux 内核中,可以使用 tasklet_init 函数对 tasklet 进行动态初始化。该函数原型为:

void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);

  其中,t 是指向 tasklet 结构体的指针,func 是 tasklet 的处理函数,data 是传递给处理函数的参数

1.3、关闭函数

  在 Linux 内核中,可以使用 tasklet_disabled 函数来关闭一个已经初始化的tasklet。该函数的原型如下:

void tasklet_disable(struct tasklet_struct *t);

  其中,t 是指向 tasklet 结构体的指针。
  关闭 tasklet 后,即使调用 tasklet_schedule 函数触发 tasklet,tasklet 的处理函数也不会再被执行。这可以用于临时暂停或停止 tasklet 的执行,直到再次启用(通过调用tasklet_enable函数)。
  需要注意的是,关闭 tasklet 并不会销毁 tasklet 结构体,因此可以随时通过调用tasklet_enable 函数重新启用 tasklet,或者调用 tasklet_kill 函数来销毁tasklet。

1.4、使能函数

  在 Linux 内核中,可以使用 tasklet_enable 函数来使能(启用)一个已经初始化的tasklet。该函数的原型如下:

void tasklet_disable(struct tasklet_struct *t);

  使能 tasklet 后,如果调用 tasklet_schedule 函数触发 tasklet,则tasklet 的处理函数将会被执行。这样,tasklet 将开始按计划执行其处理逻辑。
  需要注意的是,使能 tasklet 并不会自动触发 tasklet 的执行,而是通过调用tasklet_schedule函数来触发。同时,可以使用 tasklet_disable 函数来临时暂停或停止tasklet 的执行。如果需要永久停止 tasklet 的执行并释放相关资源,则应调用 tasklet_kill 函数来销毁tasklet。

1.5、调度函数

  在 Linux 内核中,可以使用 tasklet_schedule 函数来调度(触发)一个已经初始化的tasklet执行。该函数的原型如下:

void tasklet_schedule(struct tasklet_struct *t);

  需要注意的是,调度 tasklet 只是将 tasklet 标记为需要执行,并不会立即执行tasklet 的处理函数。实际的执行时间取决于内核的调度和处理机制。

1.6、销毁函数

  在 Linux 内核中,可以使用 tasklet_kill 函数来销毁一个已经初始化的tasklet,释放相关资源。该函数的原型如下:

void tasklet_kill(struct tasklet_struct *t);

  调用 tasklet_kill 函数会释放 tasklet 所占用的资源,并将tasklet 标记为无效。因此,销毁后的 tasklet 不能再被使用。需要注意的是,在销毁 tasklet 之前,应该确保该 tasklet 已经被停止(通过调用tasklet_disable 函数)。否则,销毁一个正在执行的 tasklet 可能导致内核崩溃或其他错误。一旦销毁了 tasklet,如果需要再次使用 tasklet,需要重新进行初始化(通过调用tasklet_init函数)。在下一小节中我们将使用上述 tasklet 函数相关接口函数进行相应的实验。

二、代码示例

2.1、驱动层程序

#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
// #include <linux/delay.h>int irq;
struct tasklet_struct mytasklet;// 定义tasklet处理函数
void mytasklet_func(unsigned long data)
{printk("data is %ld\n", data);// msleep(3000);
}// 中断处理函数
irqreturn_t test_interrupt(int irq, void *args)
{printk("This is test_interrupt\n");tasklet_schedule(&mytasklet); // 调度tasklet执行return IRQ_RETVAL(IRQ_HANDLED);
}
// 模块初始化函数
static int interrupt_irq_init(void)
{int ret;irq = gpio_to_irq(101); // 将GPIO转换为中断号printk("irq is %d\n", irq);// 请求中断ret = request_irq(irq, test_interrupt, IRQF_TRIGGER_RISING, "test", NULL);if (ret < 0){printk("request_irq is error\n");return -1;}// 初始化tasklettasklet_init(&mytasklet, mytasklet_func, 1);return 0;
}
// 模块退出函数
static void interrupt_irq_exit(void)
{free_irq(irq, NULL);tasklet_enable(&mytasklet); // 使能tasklet(可选)tasklet_kill(&mytasklet);   // 销毁taskletprintk("bye bye\n");
}module_init(interrupt_irq_init); // 指定模块的初始化函数
module_exit(interrupt_irq_exit); // 指定模块的退出函数

2.2、linux中断下文之tasklet使用API要点

struct tasklet_struct mytasklet;
// 初始化tasklettasklet_init(&mytasklet, mytasklet_func, 1);
tasklet_schedule(&mytasklet); // 调度tasklet执行
http://www.hkea.cn/news/862888/

相关文章:

  • 先做网站再付款百度推广的广告真实可信吗
  • 湖南省人民政府一事一办企业网站seo排名优化
  • 深圳招聘网官方网站网站搜索引擎优化
  • 怎么知道一个网站是谁做的中国最大的企业培训公司
  • m2c是什么意思南昌百度seo
  • 专业做羽绒服的服装网站域名注册网
  • 公司网站建设需要显示什么软件世界球队最新排名
  • 做微信平台图片网站有没有免费的广告平台
  • 渭南网站建设风尚网络站长工具seo词语排名
  • 广告传媒网站模板免费网站推广方式
  • 如何用api方式做网站域名批量查询工具
  • wordpress 网易云跟帖优化合作平台
  • 建设党建网站联盟青岛网站推广公司
  • 石湾网站建设湘潭关键词优化服务
  • 淘宝优惠券怎么做网站网络服务提供商
  • 哪里有网站建设电话查排名官网
  • 做网站需要准备的工具网络营销方案模板
  • 科技未来网站建设百度推广开户公司
  • 十度网站建设保定网站推广公司
  • php可以做视频网站有哪些软文推广渠道主要有
  • 成都网站建设桔子科技淘宝付费推广有几种方式
  • 福田的网站建设公司网络营销成功案例ppt免费
  • 网站建设英文专业术语百度推广网址
  • 做网站之前需要准备什么企业网络营销策划案
  • dreamweaver动态网站开发与设计教程内容怎么在百度上面打广告
  • 济南网站搜索优化深圳网络推广招聘
  • 网站 色彩武汉it培训机构排名前十
  • 怎么做资源网站网络培训中心
  • 服装品牌网站建设营销网站建设选择原则
  • 乌鲁木齐新市网站建设有哪些网络营销公司