Hello all,

I've been toying with this idea for a while and I found time and played around 
a bit the last couple of days. The principle here is that with model huge, most 
source files can be allocated to any code segment. The reasoning is that with a 
'large' project, manual bank assignment requires a fair bit of maintenance and, 
for the not-so-experienced user, can lead to bank overflows and 'why on earth 
is my device crashing all the time?' moments.

What I've done with contiki for cc2430 is, I've written a script which gets 
invoked by the build system. Things work like this:

- For sources that need to be in a certain segment, we specify so with a pragma 
or with --codeseg (e.g. sources with ISRs).
- Compile everything and link. Free-to-reallocate modules are initially 
assigned to a dummy segment
- The script reads the mem, map and rel files for information on code sizes
- We calculate the remaining free space of each bank by subtracting 
pre-allocated code size from their capacity. Pre-allocated in this context also 
means CONST, startup code, huge libraries etc
- We then allocate the remaining segments to banks automatically. This problem 
is a very simple bin-packing variant, which can be solved with a very fast 
heuristic (first-fit, decreasing is what I've done but there are probably 
better approaches)
- Having reached a feasible target assignment, we edit each modules's .rel 
in-place and then re-link.

So users are free to manually specify as many assignments as they like.

I built a 6lowpan border router for cc243x (Sensinode n601 NanoRouters) with 
this technique. The output at the end of this message shows what I'm doing. As 
can be seen, the resulting build is rather crowded but segments are getting 
filled up quite nicely. The image has so far been working as intended

Having to rely on Make, a script and two linker invocations, the current 
approach is a bit ugly. I am now planning to try and dig through the SDCC 
sources, see if I can make this built-in. My initial thoughts about this:

- It would need a new linker argument in order to specify the capacity of each 
bank. Something like -Wl-xyzBANK1=0x8000. Probably also a new linker argument 
to turn the feature on/off
- A way of specifying that a source is free to move around. This could be as 
simple as a reserved codeseg keyword, e.g. --codeseg __ANY or it could be a new 
compiler argument. In the rel file, the A __ANY line would probably be enough 
(?)

Any form of feedback would be great. Do you think this is 
reasonable/feasible/remotely interesting? Any caveats I should watch out for?

Best Regards and as ever, thank you for your time and for all the efforts 
maintaining SDCC
George

First Link
===============
sdcc --model-huge --stack-auto -DSDCC_CC2430 --out-fmt-ihx --xram-loc 0xE000 
--xram-size 0x1F00 --code-loc 0x00000 --code-size 0x20000 -Wl-bBANK1=0x018000 
-Wl-r -o border-router.ihx obj_sensinode/contiki-sensinode-main.rel 
obj_sensinode/border-router.app.rel -llibsdcc.lib -lcontiki-sensinode.lib
...

Bank Allocation
===============
python ../../../cpu/cc2430/bank-alloc.py border-router 
obj_sensinode/segment.rules 
Total Size = 114797 bytes (100987 bankable, 2029 user-allocated, 11781 
const+libs)
Preallocations: HOME=13810, BANK1=0, BANK2=0, BANK3=0
Bin-Packing results (target allocation):
Segment - max - alloc
   HOME  32768  18564
  BANK1  32768  32758
  BANK2  32768  32762
  BANK3  30720  30713

Final Link
===============
sdcc --model-huge --stack-auto -DSDCC_CC2430 --out-fmt-ihx --xram-loc 0xE000 
--xram-size 0x1F00 --code-loc 0x00000 --code-size 0x20000 -Wl-bBANK1=0x018000 
-Wl-r -Wl-bBANK2=0x028000 -Wl-bBANK3=0x038000 -o border-router.ihx 
obj_sensinode/contiki-sensinode-main.rel obj_sensinode/border-router.app.rel 
-llibsdcc.lib -lcontiki-sensinode.lib
...

Report
===============
Code footprint:
Area                                Addr        Size          Decimal
----------------------------------  --------    --------      --------
HOME,CSEG,CONST,XINIT,GS*           00000000    00004884 =       18564. bytes 
(REL,CON,CODE)
BANK1                               00018000    00007FF6 =       32758. bytes 
(REL,CON,CODE)
BANK2                               00028000    00007FFA =       32762. bytes 
(REL,CON,CODE)
BANK3                               00038000    000077F9 =       30713. bytes 
(REL,CON,CODE)
Other memory:
   Name             Start    End      Size     Max     
   ---------------- -------- -------- -------- --------
   PAGED EXT. RAM                         0      256   
   EXTERNAL RAM     0xe000   0xf664    5733     7936   
   ROM/EPROM/FLASH  0x0000   0x3f7f8  114797   131072  
------------------------------------------------------------------------------
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to