Pointer/Function help

So, I am trying to put together two (rather involved) functions that calculate the DAC. My processing routine for CalcDAC1 and CalcDAC2 are more or less the same, but with different variables. Currently, I'm using global variables that are directly called from the routine. I would like to use the same functionality but send it the variables I want the program to use to process so instead of:

global variables:
unsigned int var1a;
unsigned int var2a;
unsigned int var3a;
unsigned int var1b;
unsigned int var2b;
unsigned int var3b;

void main(void)
{

     while(1)
     {
          CalcDAC1();
          CalcDAC2();
     }
}

void CalcDAC1(void)
{

//Do stuff with var1a
//Do stuff with var2a
//Do stuff with var3a

}

Void CalcDAC2(void)
{

//Do stuff with var1b
//Do stuff with var2b
//Do stuff with var3b

}

I instead would like to do

void main(void)
{

     while(1)
     {
          CalcDAC(var1a, var2a, var3a);
          CalcDAC(var1b, var2b, var3b);
     }
}

void CalcDAC(unsigned char var1, unsigned char var2, unsigned char var3)
{

     //Do stuff with var1
     //Do stuff with var2
     //Do stuff with var3

}

Unfortunately, my particular function has about 7-10 variables (complicated equation with lots of variables) so it requires me to create a LOT of local variables for each iteration, which I don't have the local space for (if that's the right term). Instead, I would like to send it pointers to local variables (if possible).

I ASSUME it would look something like this:

void main(void)
{

     while(1)
     {
          CalcDAC(*var1a, *var2a, *var3a);
          CalcDAC(*var1b, *var2b, *var3b);
     }
}

void CalcDAC(unsigned char *var1, unsigned char *var2, unsigned char *var3)
{

     //Do stuff with var1
     //Do stuff with var2
     //Do stuff with var3

}

Is this correct or is this even possible in C? Is this something you can only do in C++? Any help with implementation you can give me would be greatly appreciated. Thanks!

Parents
  • Well, I'm about maxxed out on global variables as well. I've had to start using the idata register because the first 128k is more or less used up. This is how I was creating the struct:

    struct
    {
            signed short var1;
            signed short var2;
            signed short var3;
    
    } DACStruct;
    

    I am now getting an address overflow error. I tried to change these to idata like this:

    struct
    {
            signed short idata var1;
            signed short idata var2;
            signed short idata var3;
    
    } DACStruct;
    

    but got the following error(s):

    SRC\VARS.C(40): error C258: 'var1': mspace illegal in struct/union
    SRC\VARS.C(40): error C258: 'var2': mspace illegal in struct/union
    SRC\VARS.C(40): error C258: 'var3': mspace illegal in struct/union

    Is there a way to place the entire struct in the idata rather than trying to break up individual parts of the struct? Or will I need to free up some space by moving other variables to idata to make room for this struct?

    Also, when I want to send a pointer to the struct, I assume I'll want to do the following:

    void main(void)
    {
         DACStruct->var1 = 1;
         DACStruct->var2 = 2;
         DACStruct->var3 = 3;
    
         CalcDAC(*DACStruct);
    }
    
    void CalcDAC(struct *DACStruct)
    {
    // do stuff with struct here
    }
    

    I think I'm implementing the second part wrong but I'm not sure. At this point, I'm trying to get the basics down.

    Does it look like this is the best approach for what I'm trying to do?

Reply
  • Well, I'm about maxxed out on global variables as well. I've had to start using the idata register because the first 128k is more or less used up. This is how I was creating the struct:

    struct
    {
            signed short var1;
            signed short var2;
            signed short var3;
    
    } DACStruct;
    

    I am now getting an address overflow error. I tried to change these to idata like this:

    struct
    {
            signed short idata var1;
            signed short idata var2;
            signed short idata var3;
    
    } DACStruct;
    

    but got the following error(s):

    SRC\VARS.C(40): error C258: 'var1': mspace illegal in struct/union
    SRC\VARS.C(40): error C258: 'var2': mspace illegal in struct/union
    SRC\VARS.C(40): error C258: 'var3': mspace illegal in struct/union

    Is there a way to place the entire struct in the idata rather than trying to break up individual parts of the struct? Or will I need to free up some space by moving other variables to idata to make room for this struct?

    Also, when I want to send a pointer to the struct, I assume I'll want to do the following:

    void main(void)
    {
         DACStruct->var1 = 1;
         DACStruct->var2 = 2;
         DACStruct->var3 = 3;
    
         CalcDAC(*DACStruct);
    }
    
    void CalcDAC(struct *DACStruct)
    {
    // do stuff with struct here
    }
    

    I think I'm implementing the second part wrong but I'm not sure. At this point, I'm trying to get the basics down.

    Does it look like this is the best approach for what I'm trying to do?

Children
More questions in this forum