请问下,我在初始的时候开了一个线程并执行,然后在中断里对信号量赋初值为什么,为什么这个线程没执行呢
在初始的时候把信号量初始化为1就能执行,而在中断里所信号量初始化为1就不执行,请问是为什么呢
这是中断函数
我在这里初始化了信号量的值为1,并开了两个线程
线程函数如下:
这个线程能正常执行。
但是,如果我不在这里初始化信号为1,而把它初始化为0,我在中断到来后再初始化为1,为什么这个线程就得不到执行了呢
【支书】上海-terry_yung
没进中断?
【村长】北京-jianwenchang
进中断了,我跟踪进去的,每次进入中断都会打印出一句话,就好像在中断中设置的信号量初始值不管用一样,
这是中断函数中我设置的信号量,难道不能在这里设置吗
【村长】北京-jianwenchang
这样还是不行,.是不是不能在中断中设置信号量呢
【村长】北京-某人
再试一种方法,在中断低半部设置信号量
【村长】北京-jianwenchang
也不行,是不是因为我用这个函数的原因,初始化信号量sema_init(&sem,1);
把它初始化为1
在中断里初始化不生效,而在别probe里初始化的就生效
【村长】北京-某人
你是不是想要在中断函数中唤醒某些等待的内核线程
【村长】北京-jianwenchang
我当初是想这样做,这是个一等待的线程,但在中断中没有唤醒
【村长】北京-某人
那你用什么信号量啊,直接用等待队列岂不是更简单?
【村长】北京-jianwenchang
我在中断中是这样唤醒的
把信号量取消也唤不醒啊,这里用它只是想保护临界资源
【村长】北京-某人
如何没有临界资源需要保护的话,就用等待队列就行,但是如果有临界资源的话就另当别论了
【村长】北京-jianwenchang
嗯,这里信号量不是必须的,主要目的是执行这个函数
也就是说中断发生时候就执行这个函数,因为这个函数中有等待,所以放线程里做,
但结果,达不到预期目的
是这个函数写得有问题吗还是由于搞了个信号量的原因呢
我把信号量去掉试试
【村长】北京-某人
函数中有等待没必要放线程里做,浪费资源,放在中断底半部即可
【村长】北京-jianwenchang
是在这个线程中去执行这个fsl_dma_self_test()这个函数
这个函数就是中断下半部分中的
【村长】北京-jianwenchang
刚才我的描述有问题,我原本是想执行的这个函数,fsl_dma_self_test(),因为有等待不能放中断中,所以才放线程里的
【村长】北京-某人
fsl_dma_self_test()有等待可以放在中断底半部,没必要单起一个线程
【村长】北京-jianwenchang
这个是中断函数,原来是放下面的那一句,这样会异常
这个函数是中断下半部分了吧
【村长】北京-某人
唉,你先学习一下什么是中断底半部是什么意思吧
又叫下半部
【村长】北京-jianwenchang
在驱动中不明白它的界线
刚才看了看,底半部原来要用别的机制来实现,比如工作队列和软中断,TASKLET等,我之前一直理解错了,谢谢某人