This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

bad structure declaration?

i'm trying to create an array of structures but when i make more than a handful my robot doesn't work.

so in main.h i have

typedef struct SPid
{
  int dState;      	 // Last position input
  int iState;      	 // Integrator state
  int iMax, iMin;    // Maximum and minimum allowable integrator state
  int desired_value; // the desired value the PID should converge upon


  float 	iGain,    	// integral gain
        	pGain,    	// proportional gain
         	dGain;     	// derivative gain
}SPid;

extern SPid vel_Gains[];

and then in main.c
#include "MAIN.H"
struct SPid vel_Gains[5];

it barely works for vel_Gains[2], (printf looks glitchy but readable) and then vel_Gains[1] works for sure...

i'm using the small memory model btw...

is there a size limitation on global variables?

thanks,
fred

Parents
  • could someone explain what this means?

    Variables live in RAM, so they can vary. RAM does not retain its values when you turn the power off. If you initialize global variables with constants in C:

    char myArray[] = { 1, 2, 3};

    the (RAM) variable myArray has to begin with the constants 1, 2, and 3. But those constants have to be stored in some sort of ROM, rather than RAM, to survive loss of power. That is, they are stored somewhere, in ROM, in addition to the actual variable myArray. Before main() executes, some piece of code has to copy any such constant initializers from ROM to the proper locations in RAM. This job is done in the Keil toolchain by the INIT.A51 code.

    You may not need this particular feature, so use of INIT.A51 is optional. If you do not link it into your code, but use static initializers anyway, your variables will not be initialized the way you think they will.


    Have you read this thread:

    http://www.keil.com/forum/docs/thread4241.asp

    And the app note it mentions?

Reply
  • could someone explain what this means?

    Variables live in RAM, so they can vary. RAM does not retain its values when you turn the power off. If you initialize global variables with constants in C:

    char myArray[] = { 1, 2, 3};

    the (RAM) variable myArray has to begin with the constants 1, 2, and 3. But those constants have to be stored in some sort of ROM, rather than RAM, to survive loss of power. That is, they are stored somewhere, in ROM, in addition to the actual variable myArray. Before main() executes, some piece of code has to copy any such constant initializers from ROM to the proper locations in RAM. This job is done in the Keil toolchain by the INIT.A51 code.

    You may not need this particular feature, so use of INIT.A51 is optional. If you do not link it into your code, but use static initializers anyway, your variables will not be initialized the way you think they will.


    Have you read this thread:

    http://www.keil.com/forum/docs/thread4241.asp

    And the app note it mentions?

Children
No data