- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 Debian 6 上使用内核模块中的计时器自动编程以从 jiffies 中获取 n 个“伪随机”数字并将它们插入循环缓冲区。当第 7 次触发 fire_timer 时(当 items_cbuf == 7 时),问题就来了,当发生这种情况时,操作系统执行在以下行崩溃:
mod_timer(&my_timer, my_timer.expires);
但之前没有,所以我不知道为什么会这样。任何提示?预期的工作方式是当缓冲区达到其容量的 80% 时,整个内容将被翻译成一个列表(即工作队列任务)
编辑:我已经放置了完整的代码,问题可能在任何地方,我不想限制分辨率。我不确定,但相关功能应该是:install_module、Open_module、Fire_timer 和 release_module。我所做的确切用途是打开并等待十秒钟,之后我从 proc 条目中读取,但由于系统卡住我无法读取
定义
#define PROC_ENTRY "modtimer"
#define PROC_ENTRY_OPS "modconfig"
#define CBUFFER_SIZE 10
#define MAX_BUFFER 512
[...]
/**********************************************************/
/*********** Open-close-read-write functions **************/
/**********************************************************/
/*Module instalation*/
int install_module(void){
int ret = 0;
/*Buffer treshold*/
TRESHOLD_SIZE = 80;
/*Delay in ticks*/
DELAY = 125;
/*timer init*/
my_timer.expires = jiffies + DELAY;
my_timer.data = 0;
my_timer.function = fire_timer;
init_timer(&my_timer);
/*workqueue init*/
workqueue_pendiente = 0;
INIT_WORK(&my_workqueue, copy_items_into_list);
/* semaphore init */
sema_init(&mtx,1);
openDevices = 0;
/*del spin_lock init*/
spin_lock_init(&spinlock);
/*buffer init*/
cbuf = create_cbuffer_t(CBUFFER_SIZE);
printk(KERN_INFO "buffer creado");
items_cbuf = 0;
/*list init*/
list_num_items = 0;
// another initializations
return ret;
}
[...]
static int modtimer_open (struct inode *inod, struct file *f){
int ret = 0;
//Iniciar el timer
if(openDevices==0){
my_timer.expires = jiffies + DELAY;
add_timer(&my_timer);
}
try_module_get(THIS_MODULE);
openDevices++;
return ret;
}
static int modtimer_release (struct inode *inod, struct file *f){
del_timer_sync(&my_timer);
flush_scheduled_work();
remove_cbuffer_t (cbuf); //delete the buffer
vacia_list_item(); //removes every element from the list
openDevices--;
module_put(THIS_MODULE);
return 0;
}
static ssize_t modtimer_read (struct file *file, char *user, size_t nbits, loff_t * offset){
struct list_head* pos = mylist.next;
struct list_head* auxpos;
list_item_t* item;
char aux[MAX_BUFFER];
char aux2[10];
int total =0;
int subt =0;
int hecho = 0;
if(down_interruptible(&mtx)){
return -EINTR;
}
while (hecho == 0){
if(pos == pos->next || list_num_items ==0){
hecho++;
}else{
item = list_entry(pos, list_item_t, links);
subt=sprintf(aux2, "%d\n",item->data);
auxpos = pos->next;
if(subt + total > MAX_BUFFER ) {
hecho++;
}else {
total+= sprintf(&aux[total],"%i\n",item->data);
list_del(pos);
vfree(item);
list_num_items--;
}
subt = 0;
pos = auxpos;
}
}
aux[total] = '\0';
up(&mtx);
copy_to_user(user,aux,total);
return total;
}
/*********************************************************/
/****************** Planified functions ******************/
/*********************************************************/
//Fills a buffer with integgers and planifies when is about to be out of space
void fire_timer(unsigned long data){
unsigned long flags;
int rnd = jiffies & 0xFF;
spin_lock_irqsave(&spinlock,flags);
if(!is_full_cbuffer_t(cbuf))
{
items_cbuf++;
insert_cbuffer_t(cbuf, rnd);
}
printk(KERN_INFO "workqueue_pendiente = %d, items_cbuf=%d, CBUFFER_SIZE = %d, TRESHOLD_SIZE = %d, umbral = %d",
workqueue_pendiente, items_cbuf, CBUFFER_SIZE, TRESHOLD_SIZE, (CBUFFER_SIZE*TRESHOLD_SIZE)/100);
if(workqueue_pendiente == 0 &&
items_cbuf >= (CBUFFER_SIZE*TRESHOLD_SIZE)/100 )
{
workqueue_pendiente=1;
schedule_work(&my_workqueue);
}
my_timer.expires = jiffies + DELAY;
spin_unlock_irqrestore(&spinlock,flags);
mod_timer(&my_timer, my_timer.expires);
}
void copy_items_into_list(struct work_struct *work){ //Dumps the buffer into the list
unsigned long flags;
list_item_t *items[items_cbuf];
int numbers[items_cbuf];
int a = -1;
while (++a < items_cbuf){
items[a] = vmalloc(sizeof(list_item_t));
}
a = -1;
spin_lock_irqsave(&spinlock,flags);
while(++a < items_cbuf){
numbers[a] = *head_cbuffer_t(cbuf);
remove_cbuffer_t(cbuf);
}
workqueue_pendiente = 0;
spin_unlock_irqrestore(&spinlock,flags);
a = -1;
if (down_interruptible(&mtx)) /*BLOQUEO*/
return;
while (++a < items_cbuf){//size_cbuffer_t(cbuf) > 0){
items[a]->data = numbers[a];
list_add_tail(&items[a]->links, &mylist);
list_num_items++;
}
up(&mtx);
}
这是我在系统卡住之前可以获得的代码:
"sleeping, remaining 6"是我测试程序的消息,内容就是
int main(void){
int l;
int i=11;
char bla[512];
l = open("/proc/modtimer",O_RDONLY);
bla[2] = '\0';
while(--i>=0){
printf("sleeping, remaining %d\n",i);
sleep(1);
}
read(l,bla,128);
close(l);
printf("numbers:%s",bla);
}
最佳答案
在 fire_timer()
中,您调用了 spin_unlock_irqrestore(&spinlock,flags);
两次,而只调用了一次 spin_lock_irqsave()
。
关于c - 带有自旋锁的定时器卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21440265/
我正在我的 xamarin.forms 应用程序中实现扫描仪功能,为此我正在使用 iOS native AVCaptureSession。但我的问题是在扫描或捕获 session 处于事件状态并且设备
所以我目前正在为我的项目制作一个音乐应用程序,它允许用户创建自己的音乐播放列表。但是,当我单击显示媒体选择器按钮时,它只显示白屏,当包含媒体选择器的 View 是 Initial View Contr
当我尝试在模拟器中启动 AVD 时,会出现一个小窗口(见图片),5 秒后它说没有响应并一直保持这种状态直到我关闭它。 我在网上搜索并尝试了所有解决方案,但都没有成功 在 BIOS 中启用了虚拟化 已安
尝试使用以下命令从视频中提取特定帧(删除了文件的特定名称!: ffmpeg -i video.mp4 -vf "select-gte(n\,6956)"-vframes 10262 文件夹/帧%d.j
我怎么知道终端正在继续工作而不中断它? 我已经运行了以下 git 命令: clone git://ligo-vcs.phys.uwm.edu/lalsuite.gituote 一段时间后它似乎被卡住了
我对 WPF 中的数据网格有一个奇怪的问题。我正在为我的应用程序使用 MVVM 模式,并且我的 View 模型实现了 idataerrorinfo 接口(interface)。每当我在添加新行后在我的
我有这个 Excel 文件,当我输入数据时它卡住了。例如,我双击一个单元格,输入数据,然后按“输入”。它会卡住而不是进入下面的细胞。按几次“enter”不会解冻程序,唯一有效的是用鼠标选择另一个单元格
我有线程池的任务队列,每个任务都有卡住锁定其正在使用的所有资源的倾向。并且除非重新启动服务,否则这些无法释放。 ThreadPool 中有没有办法知道它的线程已经被卡住?我有一个使用超时的想法(虽然我
我制作了以下小程序来确定内存是否用于 freeze(X,Goal) 之类的目标回收时 X变得无法访问: %:- use_module(library(freeze)). % Ciao Prolog n
我有一个使用 swing 的简单 java 应用程序。然而,当我执行程序时,框架将会出现,但我无法单击任何地方,并且按钮仅在几秒钟后出现。我对 javas Swing 库非常陌生,所以我可能会丢失一些
我正在尝试创建一个简单的 TCP 客户端服务器应用程序接口(interface)用户可以在按下相应按钮时启动或停止服务器我创建了一个 StartServer 按钮,当用户按下按钮时它应该连接到服务
我正在尝试从 ftp 服务器下载文件,但在检索文件时卡住了。我正在使用 commons-net-3.6.jar 我注意到的事情 当我使用 ftpClient.enterRemotePassiveMod
我正在尝试编写一个函数,该函数将能够找到位于我系统上的可执行文件搜索路径中的任意可执行文件。我遇到了一些输入会导致 SearchPathW 的问题无限期地卡住,我不确定到底发生了什么。 std::op
我的 Nativescript 应用程序的许多页面中都有 RadSideDrawer。主应用程序组件有一个 page-router-outlet并且所有其他页面都通过导航加载到此组件中。带抽屉的页面包
我有一个最小的服务器,它等待客户端连接,然后他启动一个线程,将回复发送回客户端,问题是回复。 这是服务器的代码: int port = 1234; ServerSocket servSock =
我有一个使用 C# 的 WinForms 应用程序。我尝试从文件中读取一些数据并将其插入到数据表中。虽然此操作很忙,但我的表单卡住并且我无法移动它。有谁知道我该如何解决这个问题? 最佳答案 这可能是因
在我们学校最新的项目中,我遇到了一些问题。我想观察新条目的路径,该路径是由文件导向器按钮选择的,但如果我选择任何文件,整个窗口都会卡住...我猜它被卡住,因为调用了“observePath”方法,但我
当我输入一百万作为输入数字时,我的程序卡住了。我该如何解决这个问题? 我尝试将第二个 for 循环分离为第二个函数,但没有成功。 import java.io.*; public class Arra
早上好编译我的应用程序时,我在 Android Studio 上遇到问题。我在构建时没有收到关于 app:transformClassesWithDexBuilderForDebug 的任何输出错误,
我正在使用以下触发器 DELIMITER ; CREATE TRIGGER updateCount AFTER INSERT ON user_info FOR EACH ROW BEGIN UPDA
我是一名优秀的程序员,十分优秀!