[chbot] C question: variables in GCC

Mark Atherton markaren1 at xtra.co.nz
Thu Jun 1 23:59:27 BST 2023


Thanks Charles,

Your introduction ties up well with my memory, and solution 1 was what I 
had in mind. Thanks for the quick-start, haven't been anywhere the 
linker for ages.

-Mark


On 6/2/2023 8:23 AM, Charles Manning wrote:
> Hi Mark
> 
> The C start up code works as you say. There are two main sections normally:
> .data* variables initialised to non-zero
> .bss*   variables initialised to zero
> 
> .data* are initialised by copying initialisation values from flash to 
> RAM at start.
> .bss* are normally just initialised to zero by a loop.
> 
> If you want untouched memory then you need some area outside of these 
> and there are at least two ways to do so.
> 
> 1) Create a new section in the ld script called uninitilised or something.
> Create a variable in C and use #pragmas or _attributes() to place the 
> variable in the uninitialised section.
> 2) Create a new section in the ld script at a specific location at a 
> fixed address (eg top of memory). Access it from C by creating a pointer 
> to the address.
> int *magic_place = ((int *)0x1234);
> 3) Scratch around your memory map and find an untouched address, then 
> create a pointer to it. ie. a less controlled version of 2.
> 
> I would not recommend (3) because if your code changes and the memory 
> map changes then bad things could happen.
> 
> 
> 
> On Fri, Jun 2, 2023 at 6:48 AM Mark Atherton <markaren1 at xtra.co.nz 
> <mailto:markaren1 at xtra.co.nz>> wrote:
> 
>     Hi All,
> 
>     I am working on a low-power application for an ATmega328P where the
>     watchdog is used to repeatedly restart the machine for one
>     particular state.
> 
>     One of the mechanisms (part of a bootloader) requires that the
>     number of
>     WD restarts are counted by a U16.
> 
>     I am pretty sure that C99 normally only supports initialized variables
>     (with associated value) and uninitialized variables (which are set
>     to 0).
> 
>     Is it possible to declare storage in C that isn’t touched by the
>     associated startup code ?
> 
>     Options seem to be to resort to assembler (and possibly have to do
>     battle with the linker script), or to find a couple of unused
>     Read/Write
>     peripheral registers within the 328 and use them.
> 
>     Thoughts please.
> 
>     Thanks, Mark
> 
> 
>     _______________________________________________
>     Chchrobotics mailing list Chchrobotics at lists.ourshack.com
>     <mailto:Chchrobotics at lists.ourshack.com>
>     https://lists.ourshack.com/mailman/listinfo/chchrobotics
>     <https://lists.ourshack.com/mailman/listinfo/chchrobotics>
>     Mail Archives: http://lists.ourshack.com/pipermail/chchrobotics/
>     <http://lists.ourshack.com/pipermail/chchrobotics/>
>     Meetings usually 3rd Monday each month. See http://kiwibots.org
>     <http://kiwibots.org> for venue, directions and dates.
>     When replying, please edit your Subject line to reflect new subjects.
> 
> 
> _______________________________________________
> Chchrobotics mailing list Chchrobotics at lists.ourshack.com
> https://lists.ourshack.com/mailman/listinfo/chchrobotics
> Mail Archives: http://lists.ourshack.com/pipermail/chchrobotics/
> Meetings usually 3rd Monday each month. See http://kiwibots.org for venue, directions and dates.
> When replying, please edit your Subject line to reflect new subjects.




More information about the Chchrobotics mailing list