I've been trying to decide the best forum to ask this question.  Given the last 
few subjects on both STM32s and CANopen I'll start here and if not perhaps 
someone can point me to a better place or we can take it off line.
 
I'm trying to learn a bit more about the Hardware Abstraction Layer (HAL) used 
in LinuxCNC (and on the STMBL servo drive I have).  Even WIN-2K way back when 
used a HAL but they all seem to be a tiny bit different.
 
So first some background.  A microprocessor has output and input ports.  Often 
a single pin can be programmed to be either in/out along with having all sorts 
of other functionality.  For my stuff, because my client keeps moving wires 
around I do something similar but not nearly as complex.
 
For example say I want to print out whether an external PC is running or not.  
The PC supplies a 12V out signal if it's powered and running.  The signal is 
brought into a controller running CANopen.  To see if it's on it's a simple 
test and a diagnostic message in this example.
 
    if (CPU2_ON) (void)printf(" CPU2_ON"); else (void)printf(" CPU2_OFF");
 
We don't really know what hardware pin is attached to "CPU2_ON" but this line 
in one of the include files gives a hint.
 
#define CPU2_ON                  ((ObjectDictionary[RIM2_INPUTS_NDX] & 
fCPU2_OFF_SENSE)!=0)
 
First I have this definition which states that it's a device called a RIM pin 
R11.  This is a remote module on CAN bus connected by CANopen protocol
#define fCPU2_OFF_SENSE         RIM_INPUT6         // RIM Pin R11
 
The RIM devices gather the various input pins and consolidate them into a 
single byte (8 inputs) that is then periodically transmitted on the CANopen bus 
as a PDO (Process Data Object) message.
 
The RIM_INPUT6 is bit 5 (0..7) and the masks are declared as follows.
 
// Bit map of RIM Inputs as set in the Object Dictionary image
#define RIM_INPUT6  0x20
 
Since the system can have a number of RIM modules, the information from the 
modules is stored into what is called an Object Dictionary, in this case 
indexed by RIM2_INPUTS_NDX.  So the CPU2 status is connected to RIM #2 Pin R11. 
 We don't really care which processor pin that is inside a RIM (in this case 
it's a SPI based shift register and not even on the processor)
 
Again at the application level this is all hidden or abstracted.
   if (CPU2_ON) (void)printf(" CPU2_ON"); else (void)printf(" CPU2_OFF");
 
If the CPU pin was changed to a different pin or even device all that has to 
change is the definition from
#define CPU2_ON                  ((ObjectDictionary[RIM2_INPUTS_NDX] & 
fCPU2_OFF_SENSE)!=0)
 
To something like
#define fCPU2_OFF_SENSE         PCM_INPUT1      // Power Control Module Input 
#1.
 
And then CPU2_ON becomes 
#define CPU2_ON                  ((ObjectDictionary[PCM_INPUTS_NDX] & 
fCPU2_OFF_SENSE)!=0)
 
Although this may all appear really convoluted when the compiler is all done, 
this is the code it generates for the test. One single machine code instruction 
taken directly from the .lst file.
 
275:      if (CPU2_ON) (void)printf(" CPU2_ON"); else (void)printf(" CPU2_OFF");
  0020 1f00002005   [5]     BRCLR ObjectDictionary:9,#32,*+10 ;abs = 002a
 
If I had a similar test on a LinuxCNC system and wanted to examine a switch 
input what would the code look like and how would it break down into the final 
machine instructions?
 
The problem I'm running into is that there is too much information out there, 
some of it outdated but I don't know what is current.  Much of it already 
assumes prior knowledge so once again I don't know what I don't know so it's 
hard to figure out.
 
Can someone knowledgeable with HAL and programming for LinuxCNC perhaps post a 
similar example.  Say you have an I/O board plugged into the PC bus that gives 
you 8 inputs and 8 outputs.  How does a simple test like:
 
if (COOLANT_SWITCH == 1) PUMP1 = 1; else PUMP1 = 0;
 
become abstracted through the HAL into the actual low level? How is it even 
described. If one were to write a simple HAL (is this even possible?) what 
would it look like?
 
I've tried to look at the STMBL code which also uses a HAL approach.  There a 
Python program reads files and generates C code and include files.  But there's 
so much I'm really becoming quite confused on what may well be really easy.  I 
lose track because the STMBL does so much,  So maybe a "dummy's guide to HAL on 
LinuxCNC"?
 
Thanks.
 
John Dammeyer
http://www.autoartisans.com
 
 
 
 
 

_______________________________________________
Emc-users mailing list
Emc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/emc-users

Reply via email to