I've been running 2.2.6 using at_pid for quite a while but am convertiing stuff to run trunk using run-in-place. Today I tested and found at_pid gave a kernel Oops at init. After some investigation, I found the variables that had been converted from params to pins were being initialized before being allocated. So I reversed the calling order of Pid_Init and Pid_Export and added initializations for some private variables This change is working for me: Index: at_pid.c =================================================================== RCS file: /cvs/emc2/src/hal/components/at_pid.c,v retrieving revision 1.11 diff -u -r1.11 at_pid.c --- at_pid.c 26 Oct 2008 11:51:22 -0000 1.11 +++ at_pid.c 6 Feb 2009 03:21:34 -0000 @@ -276,17 +276,17 @@ pComp = component.pidTable; for(i = 0; i < num_chan; i++, pComp++){ - // Initialize pid. - if(Pid_Init(pComp)){ - hal_exit(component.id); - return(-1); - } // Export pins, parameters, and functions. if(Pid_Export(pComp, component.id, i)){ hal_exit(component.id); return(-1); } + // Initialize pid. + if(Pid_Init(pComp)){ + hal_exit(component.id); + return(-1); + } } hal_ready(component.id); @@ -514,6 +514,13 @@ rtapi_snprintf(buf, HAL_NAME_LEN, "pid.%d.ultimate-period", id); error = hal_pin_float_new(buf, HAL_OUT, &(this->ultimatePeriod), compId); } + } else { + this->errorI = (hal_float_t *) hal_malloc(sizeof(hal_float_t)); + this->errorD = (hal_float_t *) hal_malloc(sizeof(hal_float_t)); + this->cmdD = (hal_float_t *) hal_malloc(sizeof(hal_float_t)); + this->cmdDd = (hal_float_t *) hal_malloc(sizeof(hal_float_t)); + this->ultimateGain = (hal_float_t *) hal_malloc(sizeof(hal_float_t)); + this->ultimatePeriod = (hal_float_t *) hal_malloc(sizeof(hal_float_t)); } // Export functions. @@ -705,7 +712,7 @@ *(this->cmdDd) = 0; // Force output to zero. - *this->pOutput = 0; + *(this->pOutput) = 0; // Switch to tuning mode. this->state = STATE_TUNE_IDLE;