我正在为2.6.39内核开发内核模块.(我知道这已经过时了,但这是我的评估板附带的内容,我希望在转到3.x系列之前让它工作.)
我的模块目前非常简单.它在GPIO引脚上侦听200us脉冲,然后递增计数器,每25089次迭代重置一次.(25089是稍后要使用的缓冲区的大小.)奇怪的是,我的模块在每次使用它时都会在100000次中断后死掉,而我真的很茫然.我看着改变内核的jiffy频率,但这似乎与它无关.我也试过使用无滴答内核,这似乎也没有效果.我也无法在Google上找到关于此问题的任何内容.还有其他人看过这个问题吗?
我正在为Atmel AT91处理器构建,如果这很重要的话.我将在下面列出我的崩溃消息.
root@at91:~# irq 56: nobody cared (try booting with the "irqpoll" option)
[<c0036804>] (unwind_backtrace+0x0/0xec) from [<c006eca4>] (__report_bad_irq+0x34/0xa0)
[<c006eca4>] (__report_bad_irq+0x34/0xa0) from [<c006eed0>] (note_interrupt+0x1c0/0x22c)
[<c006eed0>] (note_interrupt+0x1c0/0x22c) from [<c006d904>] (handle_irq_event_percpu+0x168/0x19c)
[<c006d904>] (handle_irq_event_percpu+0x168/0x19c) from [<c006d960>] (handle_irq_event+0x28/0x38)
[<c006d960>] (handle_irq_event+0x28/0x38) from [<c003ace0>] (gpio_irq_handler+0x74/0x98)
[<c003ace0>] (gpio_irq_handler+0x74/0x98) from [<c002b078>] (asm_do_IRQ+0x78/0xac)
[<c002b078>] (asm_do_IRQ+0x78/0xac) from [<c00313d4>] (__irq_svc+0x34/0x60)
Exception stack(0xc04b1f70 to 0xc04b1fb8)
1f60: 00000000 0005317f 0005217f 60000013
1f80: c04b0000 c04b61cc c04b5ffc c04e1224 20000000 41069265 20025cbc 00000000
1fa0: 600000d3 c04b1fb8 c0032cc8 c0032cd4 60000013 ffffffff
[<c00313d4>] (__irq_svc+0x34/0x60) from [<c0032cd4>] (default_idle+0x38/0x40) …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的功能,我需要加快速度.基本上我有一个16位数字的大数组,其中有一些洞.(大约10%)我需要遍历数组,找到连续有2 0的区域,然后用前一个和下一个元素的平均值填充它们.这在C中只需要几毫秒,但Python正在变得更糟.
我已经从普通的python数组转换为numpy数组,然后使用cython编译我的代码,但我仍然远离我的目标.我希望有更多经验的人可以看看我在做什么并给我一些反馈.
我的常规python代码如下所示:
self.rawData = numpy.fromfile(ql, numpy.uint16, 50000)
[snip]
def fixZeroes(self):
for x in range(2,len(self.rawData)):
if self.rawData[x] == 0 and self.rawData[x-1] == 0:
self.rawData[x] = (self.rawData[x-2] + self.rawData[x+2]) / 2
self.rawData[x-1] = (self.rawData[x-3] + self.rawData[x+1]) /2
Run Code Online (Sandbox Code Playgroud)
我的Cython代码看起来非常相似:
import numpy as np
cimport numpy as np
DTYPE = np.uint16
ctypedef np.uint16_t DTYPE_t
@cython.boundscheck(False)
def fix_zeroes(np.ndarray[DTYPE_t, ndim=1] raw):
assert raw.dtype == DTYPE
cdef int len = 50000
for x in range(2,len):
if raw[x] == 0 and raw[x-1] == 0:
raw[x] = …Run Code Online (Sandbox Code Playgroud) 我需要创建一个消息计数器对象 - 不要与Python的Counter类混淆.该规范要求一个初始化为0的计数器,然后递增1直到它达到4294967295,此时它应该循环回到1.
我已经实现了一个类,但这只是天真的方法.有没有更好的方法来实现这一目标?
class MessageCounter():
def __init__(self):
self.value = 0
def increment(self):
if self.value < 4294967295:
self.value += 1
else:
self.reset()
def reset():
self.value = 1
Run Code Online (Sandbox Code Playgroud)