[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-hackers
Subject:    =?UTF-8?B?SGFyZCBwaW4gdGhyZWFkIGZvciAxIGNwdSB3aXRoIGRpc2FibGVkIGludGVy?= =?UTF-8?B?cnVwdHMsIHNoZWR1b
From:       Andrey Smagin via freebsd-hackers <freebsd-hackers () freebsd ! org>
Date:       2020-11-07 22:58:15
Message-ID: 1604789895.225748578 () f745 ! i ! mail ! ru
[Download RAW message or body]


Hi, I wrote some kernel module with realtime kernel thread for latency test.
With enabled interrupts latensy very bad for gpio realtime driving.
Adding begin\end critical section make jitter 200ns(its perfect) but hang kernel
after 15 seconds of work on my orange pi-zero.
How to disable watchdog or any else ?
 
 
 
#include <sys/types.h>
#include <sys/module.h>
#include <sys/systm.h>  /* uprintf */
#include <sys/errno.h>
#include <sys/param.h>  /* defines used in kernel.h */
#include <sys/kernel.h> /* types used in module initialization */
#include <sys/kthread.h>
#include <sys/proc.h>
#include <sys/sched.h>
#include <sys/cpuset.h>
#include <sys/timetc.h>
#include <sys/time.h>
#include <sys/mutex.h>
static int                     dTimeMax = 0;
static int                     dTimeMin = 0x7FFFFFFF;
static unsigned int            dTimeAvg = 0;
static unsigned int            IntCount = 0;
static int                     Tick;
static volatile int         ThreadExit;
static struct thread        *ThreadData;
static cpuset_t                CpuSet;
static u_int64_t            MaxTimer = 0, MinTimer = 0, Timer = 0;

static void ThreadFunc()
{
    cpuset_setthread( ThreadData->td_tid, &CpuSet );
    thread_lock( ThreadData );
    sched_class( ThreadData, PRI_REALTIME );
    thread_unlock( ThreadData );
    sched_pin();
    while( ThreadExit == 0 )
    {
        u_int T1,T2;
        for( ; !ThreadExit ; Timer++)
        {
            T1=timecounter->tc_get_timecount(timecounter);
            T2=timecounter->tc_get_timecount(timecounter);
            Tick = T2 - T1;
            if ( Tick > dTimeMax ) { MaxTimer = Timer; dTimeMax = Tick; }
            if ( Tick < dTimeMin ) { MinTimer = Timer; dTimeMin = Tick; }
            if ( Tick > 1 )
            {
                IntCount++;
                if ( dTimeAvg > 0 )
                    dTimeAvg = ( dTimeAvg * 15 + Tick * 16 ) / 16;
                else
                    dTimeAvg = Tick*16;
            }
        }
    }
    ThreadExit = 2;
    sched_unpin();
    kthread_exit();
}
static struct kthread_desc ThreadDesc = { "gpio_rt_thread", ThreadFunc, &ThreadData \
}; static int gpio_rt_loader(struct module *m, int what, void *arg)
{
    int err = 0;
    switch (what) {
    case MOD_LOAD:                /* kldload */
        ThreadExit = 0;
        memset( &CpuSet, 0, sizeof(CpuSet) );
        CPU_SET( 3, &CpuSet );
        kthread_start( &ThreadDesc );
        uprintf("GPIO realtime extenions KLD loaded.\n");
        break;
    case MOD_UNLOAD:
        ThreadExit = 1;
        while( ThreadExit == 1 );
        uprintf("GPIO jitter dTimeMax = %d (%lld) \tdTimeAvg = %d \tdTimeMin = \
%d(%lld) \t%lld\t%d\t\n", dTimeMax, MaxTimer, dTimeAvg/16, dTimeMin, MinTimer, Timer, \
IntCount );  uprintf("GPIO realtime extenions KLD unloaded.\n");
        break;
    default:
        err = EOPNOTSUPP;
        break;
    }
    return(err);
}
static moduledata_t gpio_rt_mod = {    "gpio_rt",    gpio_rt_loader,    NULL };
DECLARE_MODULE(gpio_rt, gpio_rt_mod, SI_SUB_KLD, SI_ORDER_ANY);
 
 
 
--
Andrey Smagin
_______________________________________________
freebsd-hackers@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic