www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Blackfin uClinux nutzt nicht den ganzen RAM


Autor: Robert Lorey (robi-wan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich nutze das SRV-1 Board um mit uClinux und der Opencv Bildanalysen 
durchzuführen.

Da die Opencv-Bibliotheken zu groß sind um sie in das Image für den 
Flash zu integrieren, gehe im Moment folgendermassen vor:

Nach dem kompilieren des uClinux wird das erstellte Image (ohne opencv 
und meine Programme) in den Flash geschrieben. Den Inhalt von 
rootfs.ext2 kopiere ich auf eine SD-Karte und kopiere dann die 
bibliotheken nach '.../SD-Karte/libs' bzw die Programme nach 
'.../SD-karte/bin'. Im Moment werden nur auf der SD-Karte gespeicherte 
Bilder Analysiert, da mein SRV-1 leider mit dem OV7725 Kameramodul kam 
und ich bisher nur Treiber für den OV9655 gefunden habe.
Zum Booten wird dann das Image aus dem Flash in den RAM entpackt, und 
von dort gebootet, mit der SD-Karte als root.

Auf dem Blackfin siehts nach dem Booten so aus:

#cat /proc/meminfo

MemTotal:          14048 kB
MemFree:           11532 kB

Da die Opencv-Bibliotheken allerdings schon rund 10MB groß sind, bleibt 
da net mehr viel Luft für den Rest. Wenn die zu analysierenden Bilder 
eine gewisse Größe überschreiten (320x240 geht noch 640x480 nicht mehr), 
reicht der RAM nicht mehr aus.

Der Komplette Bootvorgang sieht folgendermassen aus:
CPU:   ADSP BF537 Rev.: 0.3
Board: ADI BF537 stamp board
       Support: http://blackfin.uclinux.org/
Clock: VCO: 442 MHz, Core: 442 MHz, System: 88 MHz
SDRAM: 32 MB
FLASH:   4 MB
In:    serial
Out:   serial
Err:   serial
Net:  ADI BF537 EMAC
I2C:   ready
Hit any key to stop autoboot:  1  0 

EEPROM @0x0 read: addr 01000000  off 30000  count 2646053 ... ........................................done

## Booting image at 01000000 ...

   Image Name:   uClinux Kernel and ext2
   Created:      2010-06-01   6:29:11 UTC
   Image Type:   Blackfin Linux Kernel Image (gzip compressed)
   Data Size:    2645989 Bytes =  2.5 MB
   Load Address: 00400000
   Entry Point:  0052c2e0
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK
Starting Kernel at = 52c2e0

Linux version 2.6.28.10-ADI-2009R1 (robi-wan@Robolab) (gcc version 4.1.2 (ADI svn)) #44 Tue Jun 1 08:28:22 CEST 2010
Board Memory: 32MB
Kernel Managed Memory: 32MB
Memory map:
  fixedcode = 0x00000400-0x00000490
  text      = 0x00400000-0x004bc270
  rodata    = 0x004bc270-0x00501da4
  bss       = 0x00502000-0x0051bb00
  data      = 0x0051bb00-0x0052a000
    stack   = 0x00528000-0x0052a000
  init      = 0x0052a000-0x0053a000
  available = 0x0053a000-0x01600000
  rootfs    = 0x01600000-0x02000000
Hardware Trace Off and Disabled
Boot Mode: 3
Blackfin support (C) 2004-2009 Analog Devices, Inc.
Compiled for ADSP-BF537 Rev 0.3
Blackfin Linux support by http://blackfin.uclinux.org/
Processor Speed: 442 MHz core clock and 88 MHz System Clock
MPU: setting up cplb tables with memory protection
Instruction Cache Enabled for CPU0
Data Cache Enabled for CPU0 (write-back)
Built 1 zonelists in Zone order, mobility grouping off.  Total pages: 5588
Kernel command line: root=/dev/mmcblk0p1 rw rootdelay=2 earlyprintk=serial,uart0,115200 console=ttyBF0,115200 mem=32M
Configuring Blackfin Priority Driven Interrupts
PID hash table entries: 128 (order: 7, 512 bytes)
console [ttyBF0] enabled
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory available: 14048k/32768k RAM, (64k init code, 752k kernel code, 440k data, 0k dma, 7224k reserved)
Calibrating delay loop... 882.68 BogoMIPS (lpj=1765376)
Security Framework initialized
Mount-cache hash table entries: 512
Blackfin Scratchpad data SRAM: 4 KB
Blackfin L1 Data A SRAM: 16 KB (10 KB free)
Blackfin L1 Data B SRAM: 32 KB (32 KB free)
Blackfin L1 Instruction SRAM: 48 KB (38 KB free)
Blackfin DMA Controller
stamp_init(): registering device resources
msgmni has been set to 27
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler cfq registered
bfin-dma: initialized
Serial: Blackfin serial driver
bfin-uart.1: ttyBF0 at MMIO 0xffc00400 (irq = 18) is a BFIN-UART
Linux video capture interface: v2.00
OV9655: i2c driver ready
uclinux[mtd]: RAM probe address=0x1600000 size=0xa00000
Creating 1 MTD partitions on "RAM":
0x00000000-0x00a00000 : "ROMfs"
bfin-spi bfin-spi.0: Blackfin on-chip SPI Controller Driver, Version 1.0, regs_base@ffc00500, dma channel@7
i2c /dev entries driver
i2c-bfin-twi i2c-bfin-twi.0: Blackfin BF5xx on-chip I2C TWI Contoller, regs_base@ffc01400
mmc_spi spi0.2: ASSUMING 3.2-3.4 V slot power
mmc_spi spi0.2: SD/MMC host mmc0, no DMA, no WP, no poweroff
Waiting 2sec before mounting root device...
mmc_spi spi0.2: requested mode not fully supported
mmc_spi spi0.2: can't change chip-select polarity
mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new SD card on SPI
mmcblk0: mmc0:0000 SD064 59.5 MiB 
 mmcblk0: p1
EXT2-fs warning: mounting unchecked fs, running e2fsck is recommended
VFS: Mounted root (ext2 filesystem).
No usable address families found.
socket: Function not implemented
modprobe: Module blackfin_cam not found.

Welcome to:
         _________                       _____ ____ _    _____
  __  __/ ____/ (_)___  __  ___  __     / ___// __ \ |  / <  /
 / / / / /   / / / __ \/ / / / |/_/_____\__ \/ /_/ / | / // / 
/ /_/ / /___/ / / / / / /_/ />  </_____/__/ / _, _/| |/ // /  
\__,_/\____/_/_/_/ /_/\__,_/_/|_|     /____/_/ |_| |___//_/   

For further information see:
http://www.surveyor.com/


BusyBox v1.13.4 (2010-06-01 08:27:05 CEST) built-in shell (msh)
Enter 'help' for a list of built-in commands.

# cat /proc/meminfo
cat /proc/meminfo

MemTotal:          14048 kB
MemFree:           11532 kB
Buffers:              72 kB
Cached:              476 kB
SwapCached:            0 kB
Active:              380 kB
Inactive:            124 kB
Active(anon):          0 kB
Inactive(anon):        0 kB
Active(file):        380 kB
Inactive(file):      124 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:             0 kB
Mapped:                0 kB
Slab:                516 kB
SReclaimable:        160 kB
SUnreclaim:          356 kB
PageTables:            0 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:        7024 kB
Committed_AS:          0 kB
VmallocTotal:          0 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
# # 

Ja, ich nutze ein altes U-Boot Image, allerdings wurde das vom 
Hersteller geliefert und funktioniert. Ich wollte erstmal das mit dem 
selbstgebauten uClinux hinbekommen, bevor ich mich ans U-Boot wage.

zu meinen Fragen:
Wenn ich ein neues U-Boot baue, das von SD-Karte booten kann (über SPI), 
muss ich nicht mehr das Image aus dem Flash in den RAM entpacken, 
sondern würde nur den Kernel laden. Da sollte ich ca 10MB rausholen 
können.
Muss dafür die uClinux-Config geändert werden, bzw was kann noch (und 
wie) optimiert werden?
Hat schon jemand ein neues U-Boot mit SPI-MMC/SD Unterstützung für den 
SRV-1 gebaut und/oder könnte dazu Tipps geben?

--> Eigentlich brauch ich doch nur mehr RAM.

Für jegliche Hilfe / Winks mit Zaunpfählen bin ich Dankbar.

Gruss,
Robert

Autor: Martin S. (strubi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Robert,

beim SRV1 ist in der Tat das Speicheroptimieren knifflig.
Folgendes hilft:

* Kernel vom rootfs trennen, oder rootfs minimal klein machen (nur 
busybox)
* Weitere Partition, z.B. /opt als JFFS2 hinzufuegen. Dazu muss die 
arch/blackfin/mach-bf537/boards/srv1.c angepasst werden (in deiner 
uClinux-Version koennte das noch eine minotaur.c sein, da die Boards 
sehr aehnlich sind). Dann speicherst du alle externen user-programme auf 
die jffs2
* Wenn im FLAT-Format compiliert, sparst du ev. weiter Platz, wenn Du 
nur die busybox und ein paar wenige kleine tools benutzt. ELF-FDPIC 
lohnt oft nur, wenn Du einige grosse Programme installierst, die die 
libc und andere extensiv nutzen. Muss man ausprobieren.

Die meisten Tricks oben sind unter docs.blackfin.uclinux.org 
dokumentiert. Vermutlich steht in deiner .config noch 
CONFIG_MTD_UCLINUX=y, schau mal nach
CONFIG_BLK_DEV_INITRD, usw.
Wichtig ist, dass man im u-boot das Root-Device nach solchen aenderungen 
anpassen muss (root=/dev/mtdblockX), sonst gibt's den ueblichen panic(), 
wenn er das Rootdevice nicht findet.

Viel Erfolg & Gruesse,

- Strubi

Autor: Robert Lorey (robi-wan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde sehr gerne den Kernel vom rootfs trennen, dann muss ich das 
rootfs nicht mehr unnütz in den ram entpacken, das soll ja eh auf der 
SD-Karte bleiben.

Ich habe das STAMP-Board ausgewählt, da mit dem Minotaur make nicht 
durchgelaufen ist. Beim STAMP musste ich lediglich den Chipselect vom 
MMC-Teil anpassen und es ging wie geplant.

Wenn ich allerdings MTD in der config rausnehme, bekomme ich zwar ein 
Kernelimage, allerdings wenn ich dieses boote, mit der SD-Karte als 
rootfs, bekomme ich immer die Fehlermeldung, das er kein INIT ausführen 
kann.

Ein INITRD-Image hab ich nicht konfiguriert, war bisher auch nicht 
nötig.

Was kommt denn normalerweise in das INITRD-Image rein (auswahl bei make 
menuconfig)?

Hast du denn eine .../boards/srv1.c ?
Bei der 2009R1-RC6 war zumindest keine dabei.

Gruss,
Robert

Autor: Strubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Robert,

sorry, hat etwas gedauert -- es gibt einen bald offiziellen Port und 
auch Support von surveyor.com, erste Sourcecode-Snippets zum 
2009R1.1-RC4 gibt es hier:

http://code.google.com/p/srv1-linux/

Allerdings fruehes Stadium, da verschiedene Implementationen und 
Sensoren bei uns vorherrschen, ist die Video-Sache noch nicht getestet.

Gruesse,

- Strubi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.