linux / timer.h setup_timer () функция срока действия не работает? - PullRequest
0 голосов
/ 16 февраля 2010

Таким образом, функция TimerExpire в моем setup_timer () вызывает огромную панику (будет опубликовано ниже), в то время как обычный вызов функции TimerExpire () фактически распечатает мой ввод.

void TimerExpire(char* data)
{
    printk("Timer Data: %s\n", data);
}

setup_timer(&my_timer, TimerExpire, (char *)args);
printk("Made timer: %s\n", (char *)args);
TimerExpire((char *)args);

Кто-нибудь знает почему?

Это вывод ошибки (кстати, это на эмуляторе gumstix verdex, который является ядром linux): (Не обращайте внимания на самый первый символ обратной черты, я использовал его, чтобы убежать.)

`# Невозможно обработать пейджинговый запрос ядра по виртуальному адресу be940eb2. пгд = с0004000 [be940eb2] * pgd = 00000000 Внутренняя ошибка: упс: 35 [# 1] Связанные модули: mytimer ipv6 pxa2xx_cs pxa2xx_core pcmcia pcmcia_core firmware_class pxamci mmc_block mmc_core CPU: 0 ПК находится по адресу: 0x20 / 0x34 LR находится на vsnprintf + 0x318 / 0x5c8 pc: [] lr: [] не испорчен sp: c01b9d88 ip: c01b9d98 fp: c01b9d94 r10: 00000000 r9: c01ca148 r8: ffffffff r7: c01ce468 r6: c01c9d54 r5: be940eb2 r4: c01b9e94 r3: c01a0808 r2: be940eb2 r1: fffffffe r0: be940eb2 Флаги: NzCv IRQ отключены от FIQ в режиме SVC_32 Сегментное ядро Контроль: 7977 Таблица: A3488000 ЦАП: 00000017 Процесс подкачки (pid: 0, предел стека = 0xc01b8258) Стек: (от 0xc01b9d88 до 0xc01ba000) 9d80: c01b9de4 c01b9d98 c00d7d4c c00d6bd4 00000000 c01b9e4c 9da0: 00000989 00000033 c01b9e24 00000400 c01c9d48 bf06523d 000080d5 00000400 9dc0: bf065054 c01b9e94 c01ce468 00000000 69054114 c01b8000 c01b9dfc c01b9de8 9de0: c00d814c c00d7a40 00000000 bf065230 c01b9e74 c01b9e00 c00381b8 c00d8140 9e00: c01b9e24 20000193 00000001 60000113 00000000 c0276db0 00000000 00000003 9e20: c01b9e3c c01b9e30 c003468c c0034508 c01b9e6c c01b9e40 c0033268 c0034684 9e40: 00000989 20000193 c01b9ec4 00000100 bf065054 bf065944 c01ce468 00000000 9e60: 69054114 c01b8000 c01b9e8c c01b9e78 c003845c c003810c bf065944 c01b9e94 9e80: c01b9eac c01b9ea0 bf06504c c0038444 bf065230 be940eb2 c01b9ec8 60000113 9ea0: c01b9ebc c01b9eb0 bf065064 bf065040 c01b9ef4 c01b9ec0 c003ffb8 bf065060 9ec0: bf065960 c0040d08 c01b9ec8 c01b9ec8 00000001 c01ce264 0000000a c01e1d7c 9ee0: a001419c a0014168 c01b9f14 c01b9ef8 c003c7c4 c003fe60 69054114 0000001a 9f00: c01ba680 00000000 c01b9f24 c01b9f18 c003cb88 c003c770 c01b9f44 c01b9f28 9f20: c002957c c003cb50 c00086f4 ffffffff c01b9f7c 04000000 c01b9f9c c01b9f48 9f40: c0028830 c0029540 00000001 c01b8000 a0000013 20000013 c0029d44 c01b8000 9f60: c00153e8 c01e1d7c a001419c 69054114 a0014168 c01b9f9c c01b9f90 c01b9f90 9f80: c0029d8c c0029d98 20000013 ffffffff c01b9fb4 c01b9fa0 c0029b1c c0029d50 9fa0: c01dc20c c01c88b0 c01b9fc4 c01b9fb8 c0028138 c0029af0 c01b9ff4 c01b9fc8 9fc0: c0008adc c0028120 c00083e4 00000000 00000000 c00153e8 00000000 00007975 9fe0: c01c8964 c01be264 00000000 c01b9ff8 a0008030 c00088bc 00000000 00000000 Backtrace: [] (strnlen + 0x0 / 0x34) из [] (vsnprintf + 0x318 / 0x5c8) [] (vsnprintf + 0x0 / 0x5c8) из [] (vscnprintf + 0x18 / 0x24) [] (vscnprintf + 0x0 / 0x24) из [] (vprintk + 0xb8 / 0x334) r4 = BF065230 [] (vprintk + 0x0 / 0x334) из [] (printk + 0x28 / 0x30) [] (printk + 0x0 / 0x30) из [] (PrintMessage + 0x18 / 0x20 [mytimer]) r3 = 60000113 r2 = C01B9EC8 r1 = BE940EB2 r0 = BF065230 [] (PrintMessage + 0x0 / 0x20 [mytimer]) из [] (TimerExpire + 0x10 / 0x14 [mytimer]) [] (TimerExpire + 0x0 / 0x14 [mytimer]) из [] (run_timer_softirq + 0x164 / 0x1e8) [] (run_timer_softirq + 0x0 / 0x1e8) из [] (__do_softirq + 0x60 / 0xd4) [] (__do_softirq + 0x0 / 0xd4) из [] (irq_exit + 0x44 / 0x4c) r6 = 00000000 r5 = C01BA680 r4 = 0000001A [] (irq_exit + 0x0 / 0x4c) из [] (asm_do_IRQ + 0x48 / 0x60) [] (asm_do_IRQ + 0x0 / 0x60) из [] (__irq_svc + 0x30 / 0x80) r6 = 04000000 r5 = C01B9F7C r4 = FFFFFFFF [] (default_idle + 0x0 / 0x5c) из [] (cpu_idle + 0x38 / 0x54) [] (cpu_idle + 0x0 / 0x54) из [] (rest_init + 0x24 / 0x2c) r5 = C01C88B0 r4 = C01DC20C [] (rest_init + 0x0 / 0x2c) из [] (start_kernel + 0x22c / 0x284) [] (start_kernel + 0x0 / 0x284) из [] (0xa0008030) Код: ea000000 e2800001 e2511001 3a000002 (e5d03000) Паника ядра - не синхронизируется: Aiee, убивающий обработчик прерываний!

Ответы [ 2 ]

3 голосов
/ 16 февраля 2010

Просто очень дикое предположение здесь. Но я бы предложил сузить все до

  • сначала удалите printk из функции таймера (чтобы убедиться, что printk () виновен)
  • если это работает, заставьте printk печатать статическую строку (без параметров), чтобы узнать, разрешено ли вам printk из этого контекста (может быть, printk не приветствуется в контексте softirq)
  • затем начинайте проверять, доступны ли данные, вы передаете указатель на какую-то строку, знаете ли вы, что эта строка все еще существует? это глобальная строка (и, следовательно, доступная или нет).

Если вы посмотрите в timer.h , указатель на данные просто сохраняется, поэтому, если этот указатель выходит за пределы досягаемости или становится недоступным, я ожидаю, что такое поведение от printk.

1 голос
/ 16 февраля 2010

Кто контролирует память, на которую указывает указатель data? Может ли эта память быть переработана к тому времени, когда ваш таймер выключился?

Возможно, вам следует сделать копию этих данных, где вы можете быть уверены, что они будут действительны позже.

Для проверки проверьте, может ли TimerExpire() напечатать сообщение без строки. Если это работает, значит, проблема в указателе, а не в таймере.

...