Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
11 / 11 / 11
Регистрация: 18.01.2016
Сообщений: 98

Виснет поток в модуле ядра

03.12.2018, 14:23. Показов 1124. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Есть модуль ядра который принимает информацию от программы и записывает ее на плату, мне нужно сделать защиту от зависания программы, т. е. если программа не присылает никакакой информации то сбрасывать состояние платы. Сам сброс сделать получилось но теперь модуль переодически вызывает зависание всей машины, может кто нибудь по коду подсказать где косяк?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <linux/mutex.h>
#include <asm/atomic.h>
#include <linux/kernel.h>
#include <linux/kthread.h>
 
#include "kdriver.h"
 
#define FPO_ACTIVE 1
#define FPO_NOT_ACTIVE 2
 
#define SLEEP_TIME 500
 
DECLARE_WAIT_QUEUE_HEAD(concurencyQueue);
static bool concurencyFlag = false;
 
DEFINE_SPINLOCK( concurencySpinLock );
 
void set_concurency_flag(bool flag)
{
    spin_lock(&concurencySpinLock);
    concurencyFlag = flag;
    spin_unlock(&concurencySpinLock);
}
 
bool get_concurency_flag(void)
{
    spin_lock(&concurencySpinLock);
    bool flag = concurencyFlag;
    spin_unlock(&concurencySpinLock);
 
    return flag;
}
 
//--------------------------------------------------
 
static daq_device_t* _dev = NULL;
static struct task_struct* receiveThread = NULL;
 
atomic_t isRunning = ATOMIC_INIT(0);
 
 
static int startKernel(void* emptyName)
{
    static  DIO_RW_PORTS rwPorts;
    static __u8 data[MAX_DIO_PORT_COUNT];
 
    rwPorts.PortStart = 0;
    rwPorts.PortCount = MAX_DIO_PORT_COUNT;
    memset(data, 0, MAX_DIO_PORT_COUNT);
    rwPorts.Data = data;
 
    while(atomic_read(&isRunning))
    {
        set_concurency_flag(false);
        wait_event_timeout (concurencyQueue, concurencyFlag, SLEEP_TIME);
 
        if( ! get_concurency_flag())
        {
            daq_ioctl_do_write_port(_dev, (unsigned long)&rwPorts);
        }
    }
 
    atomic_set(&isRunning, -1);
 
    return 0;
}
 
void createAndStartTimerForDevice(daq_device_t *dev)
{
    _dev = dev;
 
    receiveThread = kthread_run( startKernel, NULL, "dropTimer");
    if (IS_ERR(receiveThread))
    {
        printk(KERN_INFO "Error: unable to start Drop Timer\n");
        receiveThread = NULL;
        _dev = NULL;
    }
    else
    {
        atomic_set(&isRunning, 1);
    }
}
 
void destroyTimer(const daq_device_t* dev)
{
    if(receiveThread != NULL && _dev != NULL && dev == _dev)
    {
        atomic_set(&isRunning, 0);
        wake_up(&concurencyQueue);
 
        while (atomic_read(&isRunning) != -1)
        {
            msleep(40);
        }
 
        receiveThread = NULL;
        _dev = NULL;
    }
}
 
void iAmAlive(void) // нет смысла ориентироваться на конкретный девайс, важно что бы хоть что то присылало
{
        set_concurency_flag(true);
        wakeDroper();
}
 
void wakeDroper(void) // !!!! дергается при чтении
{
    wake_up(&concurencyQueue);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.12.2018, 14:23
Ответы с готовыми решениями:

Создать поток, реализованный в модуле, через beginthread
Народ, помогите.Нужно вызвать поток через функцию thread:=beginthread(nil,0,@TreeModule.zacount,nil,0,nil); но как видно процедура...

Виснет поток, а с ним и приложение
Здравствуйте! Жизнь заставила использовать в своем приложении стороннюю библиотеку. Парсит текст по определенному алгоритму. Но при...

Пока поток выполняется, весь GUI виснет
Есть функция и поток, откуда она вызывается. Проблема в том, что, пока поток выполняется, весь GUI виснет. Функция воспроизводит музыку,...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2018, 14:23
Помогаю со студенческими работами здесь

Почему не все ядра загружены и, как сделать так, чтобы отдельный поток подавался на отдельное ядро?
Создал 12 потоков, а как-то не все ядра загружены. Процессор i7-3930K. using System; using System.Collections.Generic; using...

нетбук с каким процом лучше n550(2 ядра )или C-50(2 ядра )?
всем привет решил в следюющем году сдать егэ по инфе =&gt; надо готовится и учить програмирование а без практики одной теории мало по этому...

Помогайте выбрать: видюха 640М и проц i7 2.4Гц (4 ядра) или 750M и i7 2Гц (2 ядра) ?
Приветствую. Вот занес уже руку в кошелек для покупки ноута Acer ASPIRE V5-572G но тот засомневался в сторону V3-571G. Оба с ips...

Что будет лучше i7 2630qm (2 Гц 4 ядра) vs i5 3230m (2,6 Гц 2 ядра) ?
Что будет лучше i7 2630qm (2 Гц 4 ядра) vs i5 3230m (2,6 Гц 2 ядра) ? Не использую программы поддерживающие многопоточность.

Что выбрать: Intel 2 ядра или AMD 4 ядра?
Нужен дельный совет от гуру! Могу взять АМД проц 4 ядра, либо интеловский 2 ядерный, цена примерно та же. Боюсь, что с интеловским...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru