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

Global Variables vs. Pointers in Embedded Design

I've written a few 8bit embedded systems and the codebase I inherited and have expanded is basically 80% global variables (extern volatile), and than non-global control flags and logic variables as needed.

The end result, is that you end up with a lot void() functions to modify the global variables.

The systems run fine and the software quite readable and easy to work on, but I always have that design nag in the back of my head that I should be refactoring everything and pointer'ize the next design.

I don't have any religiosity about the memory usage aspect, the static memory is there to use as much as the heap is. It's more a question of as systems get larger, I suspect maybe the globals start to be more of a hinderance than you think? I've never gotten there in program size.

Do many of you experienced embedded software programmers use pointers extensively in your 8bits systems?

I can think of three possible use cases for using pointers in C51: linked lists (which we don't use) in this system, structs in place of independent variables and then functions with pointers to modify the strucs, maybe a double pointer if you absolutely need to modify a pointer but I can't fathom a situation in building a consumer product with an 8051 (maybe building an OS...).

I get that the functions can get re-used if you pointer'ize your code, but in one sense the functions are pretty trivial and one off in the embedded systems I've built. Very application specific stuff.

A couple of you guys who are still around C51 forum, what is your most compelling (or not compelling) use case for pointers in the code you have released?

Parents
  • re RTOS (architecture independent comment)

    I have seen a few projects without a RTOS that would have worked better with one.
    I have seen a several projects with a RTOS that would have worked better without one.

    Have you ever thought of whether RTOS would be used if wait I/O had not, somehow, become the norm.

    all my I/O is like this

    typedef enum
    {
    ACCEPTED,
    BUSY,
    ERROR,
    DONE
    }iostatus;
    
    iostatus startIOX(sometimes something, sometimes not)
    {
    ....
    }
    
    iostatus IOXstatus) (void)
    {
    ..
    }
    
    in main
    if (iox_to_start == true)
    startresult startIOX();
    if (startresult == ACCEPTED)
    {
      iox_to_start == fakse)
    
    
    ....
    if (IOXstatus() = DONE)
    
    }
    
    fill in error etc
    
    
    

Reply
  • re RTOS (architecture independent comment)

    I have seen a few projects without a RTOS that would have worked better with one.
    I have seen a several projects with a RTOS that would have worked better without one.

    Have you ever thought of whether RTOS would be used if wait I/O had not, somehow, become the norm.

    all my I/O is like this

    typedef enum
    {
    ACCEPTED,
    BUSY,
    ERROR,
    DONE
    }iostatus;
    
    iostatus startIOX(sometimes something, sometimes not)
    {
    ....
    }
    
    iostatus IOXstatus) (void)
    {
    ..
    }
    
    in main
    if (iox_to_start == true)
    startresult startIOX();
    if (startresult == ACCEPTED)
    {
      iox_to_start == fakse)
    
    
    ....
    if (IOXstatus() = DONE)
    
    }
    
    fill in error etc
    
    
    

Children