Variabelen groter dan 256 bytes

In tal van toepassingen is het nodig om variabelen van meer dan 256 bytes te kunnen gebruiken. Dit is bijvoorbeeld het geval wanneer je een robot met camera wil bouwen en die beelden wil kunnen bewerken of wanneer je coole effecten wil toevoegen aan een audiostream. Hoewel de PIC18F4550 van het Dwengo-bord 2048 bytes data-geheugen bevat, kan je standaard geen variabelen gebruiken die groter zijn dan 256 bytes. Hiervoor is een kleine aanpassing in het linker-script nodig.

Het aanmaken van grote variabelen gaat in 4 stappen:

Stap 1. Wijs een eigen sectie, DATA, toe aan een object dat groter is dan 256 bytes. In onderstaand voorbeeld maken we een array large_table van 768 integers (1536 bytes).

  1. #pragma udata DATA // section DATA
  2. int large_table[768];

Stap 2. Je kan toegang krijgen tot het object large_table via een pointer table_ptr. Hier wijst table_ptr naar het eerste element in de array. Je kan de array lezen of aanpassen met table_ptr[ADDRESS].

  1. #pragma udata // return to default section
  2. int *table_ptr = &large_table[0];

Stap 3. In het linkerscript wordt de volledige geheugenruimte van de PIC opgedeeld in verschillende blokken (DATABANK) die dan kunnen toegekend worden aan specifieke secties (SECTION). Pas het linker-script (lkr-bestand) aan zodat er een voldoende groot geheugenblok wordt toegekend. Dit gebeurt met het woord DATABANK waar je een NAME, START en END aan moet meegeven. In ons voorbeeld NAME=data van adres 0x200h tot en met 0x7FFh.
Merk op dat in ons voorbeeld de geheugenruimte die we wensen zo groot is dat we de buffer die oorspronkelijk gebruikt werd voor USB moeten verwijderen. De USB-functionaliteit kan je dan wel niet meer gebruiken. Verwijder dus de DATABANK-lijnen in het linkerscript voor USB (adres 0x400h tot en met 0x7FFh).

Stap 4. Tot slot wordt de aangemaakte geheugenruimte data (kleine letters) toegekend aan de DATA-sectie (hoofdletters zoals in stap 1).

Hieronder de code voor het linker-script (lkr-bestand).

  1. // File: 18f4550_bigMem.lkr
  2. // Linker scrip for PIC18F4550 and storing a large array of 1536 bytes
  3.  
  4. LIBPATH .
  5.  
  6. FILES c018i.o
  7. FILES clib.lib
  8. FILES p18f4550.lib
  9.  
  10. CODEPAGE NAME=page START=0x0 END=0x7FFF
  11. CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
  12. CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
  13. CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
  14. CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED
  15.  
  16. ACCESSBANK NAME=accessram START=0x0 END=0x5F
  17. DATABANK NAME=gpr0 START=0x60 END=0xFF
  18. DATABANK NAME=gpr1 START=0x100 END=0x1FF
  19. DATABANK NAME=data START=0x200 END=0x7FF PROTECTED
  20. ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
  21.  
  22. SECTION NAME=CONFIG ROM=config
  23. SECTION NAME=DATA RAM=data
  24.  
  25. STACK SIZE=0x100 RAM=gpr1