Linux内核模块中的周期性任务
-
25-10-2019 - |
题
目前,我正在为FriendlyArm Linux 2.6.32.2(Mini2440)开发GPIO内核模块。我来自电子背景,新来的Linux。
在启动时加载和相关设备文件的内核模块位于 /dev
作为 gpiofreq
.
在第一次写入设备文件时,GPIO PIN在50kHz处连续切换。第二次写作停止切换。第三次,它再次开始,依此类推。
我已经编写了单独的内核模块来生成FREQ。但是CPU首次编写设备文件后冻结。显示终端提示,但之后我无法运行任何命令。
这是代码刺:
//calling function which generates continuous freq at gpio
static int send_freq(void *arg)
{
set_current_state(TASK_INTERRUPTIBLE);
for(;;)
{
gpio_set_value(192,1);
udelay(10);
gpio_set_value(192,0);
udelay(10);
}
return 0;
}
这是设备写代码,该代码从编写到设备文件的任何数据开始或停止。
if(toggle==0)
{
printk("Starting Freq.\n");
task=kthread_run(&send_freq,(void *)freq,"START");
toggle=1;
}
else
{
printk("Operation Terminated.\n");
i = kthread_stop(task);
toggle=0;
}
解决方案
您在内核线程中进行无限循环,除了IRQ甚至其他内核线程外,没有其他任何事情发生。
你能做的就是
在硬件上编程计时器,并在中断中进行销售
用usleep_range替换udelay
我建议逐步做某事,从usleep_range开始在KHz范围内,最终转移到Cust OM Timer + ISR
无论哪种情况,您都可能会有很多抖动,并且在DSP或PIC上进行此类GPIO进行切换可能是一个好主意,但是除非您对PWM有帮助的GPIO有帮助,否则ARM + Linux的资源浪费了引擎。
不隶属于 StackOverflow