gcc q

gcc q

Shachar Shemesh shachar at shemesh.biz
Mon Aug 23 15:58:19 IDT 2010


Erez D wrote:
>
>
>
>     Okay. I'm going to assume that you are writing code that is meant
>     to run directly on the hardware, no external OS. Also, I'm
>     assuming you have a means to actually load that code into the
>     CPU's address space (nor flash, loader, etc.)
>
> correct
>
>
>     If those assumptions are true, and you are working with a GNU
>     toolchain (or derivative), then you, most likely, have a linker
>     control file (also known as a "linker script"). If you are not
>     sure, search for an invocation of the linker phase with the -T or
>     --script options.
>
> nope
>
> i compile with:
> avr32-g++ -O0 -g3 -Wall -c -fmessage-length=0 -mpart=uc3l064 
> -ffunction-sections -masm-addr-pseudos -oDebug\main.o main.cpp
> avr32-g++ -O0 -g3 -Wall -c -fmessage-length=0 -mpart=uc3l064 
> -ffunction-sections -masm-addr-pseudos -oDebug\uart.o uart.cpp
> avr32-g++ -mpart=uc3l064 -Wl,--gc-sections -Wl,--direct-data 
> --rodata-writable -Wl,-Map,Debug\main.map -oDebug\proj3.elf 
> Debug\main.o Debug\uart.o
>
>
>
> I saw on the internet that i should modify the crt0.S file to call my 
> initialization function
> however i can not find the crt0.S file it uses. probably already 
> compiled.
s/probably/definitely/

You have two options. The more "correct" way is to, indeed, change the C 
RunTime file. The file is probably available in object form, and you can 
detect which one by checking what is the command line that avr-g++ 
passes to avr-ld when it calls it. I am almost positive that there is a 
command line to see that, but I usually find it easier to use 'strace -f 
-e execve'.

Then again, if, for whatever reason, you do not wish to tear apart the 
internal libraries used, you can also go by my original proposed route. 
The implicit linker script can be extracted by running avr-ld --verbose. 
You can copy it out into a file, and modify it from there.

Personally, which way I'd go depends on how frequent this change you 
need to do is. If you are working on a custom hw platform, where you are 
expected to compile many programs for that platform, and that platform 
alone, I might prefer getting the sources to crt and making the change 
there. If you have several AVR platforms using the same toolchain, but 
only some of them need these registers, then I'd go the linker script 
path, as they do not require you to change the toolchain's files.

Might I ask why you cannot init these hardware registers as the first 
thing that your actual program does? Does the startup code not run 
without this init?

Shachar

-- 
Shachar Shemesh
Lingnu Open Source Consulting Ltd.
http://www.lingnu.com

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.cs.huji.ac.il/pipermail/linux-il/attachments/20100823/fde75821/attachment.html>


More information about the Linux-il mailing list