Hi all,
I got a problem when I upgrade the driver for ServoToGo board.
This driver works fine under RH 6.0, Linux Kernel 2.2.13, RTLinux 2.0. I
just change the path and compile it under RH 7.0, Linux Kernel 2.2.18,
RTLinux 3.0. It compiles fine, but when I want to insmod the driver, the
system will freeze. I found out the problem is coming from the function:
pthread_make_periodic_np(pthread_t thread, hrtime_t start_time, hrtime_t
period), when I change the period to a bigger value, the system will be
able to work for a while, but then freeze too. The bigger value I set to
period, the longer the system can work fine. I am totally confused,
what's wrong with the code.
Please give me some help on my problem!
Thanks in advance!
Hai Xu
ps The following is part of the code:
// This is the RT-Linux server thread
void *mainLoop(void *t)
{
while(1)
{
pthread_wait_np();
server->doMessageLoop();
}
}
int init_module(void)
{
int period;
pthread_attr_t threadAttributes;
struct sched_param schedulingParameters;
int retval;
sprintf(usageShmName, "%s_Usage", name);
numOfUsage = (int *)shmmgnt_k_create(usageShmName, sizeof(int));
if(!numOfUsage)
{
printk("servo2go: Error creating shared memory for usage
counter!\n");
return(1);
}
*numOfUsage = 0;
printk("servo2go: Setting up STGServer...\n");
server = (STGServer *)kmalloc(sizeof(STGServer), GFP_KERNEL);
if(!server)
{
printk("Cannot allocate memory for I/O Board
Server!\n");
shmmgnt_k_delete(usageShmName);
return 1;
}
new (server) STGServer(0, 0, 0, frequency, 0, numAdc, numDac,
numEncoders, portADirection, portBDirection,
portCDirection,
portDDirection, name, 0, boardIndex, irq,
adcRange, useAdcIrq);
if(server->isStatusError())
{
printk("servo2go: Error setting up server\n");
// We need to call the destructor because a derived
class constructor
// may have failed after a base class constructor
allocated resources
goto EXIT;
}
if( frequency == 0 )
{
printk("frequency cannot be zero! Changed to 1kHz!\n");
frequency = 1000;
}
period = HRTICKS_PER_SEC / frequency;
// Set up to run the RT thread
printk("servo2go: Starting server thread...");
pthread_attr_init(&threadAttributes);
schedulingParameters.sched_priority = 99;
pthread_attr_setschedparam(&threadAttributes,
&schedulingParameters);
pthread_attr_setstacksize(&threadAttributes, 32000);
pthread_create(&ourThread, &threadAttributes, mainLoop, (void *)
1);
printk("thread ID is 0x%X\n", ourThread);
pthread_setfp_np(ourThread, 1);
retval = pthread_make_periodic_np(ourThread, gethrtime(), period
);
if( retval )
{
printk("Can not start I/O Board Server!\n");
goto EXIT;
}
return 0;
EXIT:
shmmgnt_k_delete(usageShmName);
server->~STGServer();
kfree(server);
return 1;
}
void cleanup_module(void)
{
// Kill the server thread
pthread_delete_np(ourThread);
// Destroy the server object
server->~STGServer();
// Check the usage count. We can't prevent unloading, but we
can complain.
if(*numOfUsage)
printk("servo2go: Server %s is exiting, but is in use by
%d client(s)!\n",
name, *numOfUsage);
shmmgnt_k_delete(usageShmName);
kfree(server);
printk("servo2go: Server stopped sucessfully\n");
}
}
-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
--
For more information on Real-Time Linux see:
http://www.rtlinux.org/