Autor Thema: Linux syscall read write  (Gelesen 2136 mal)

Relbmessa

  • Beiträge: 73
    • Profil anzeigen
Gespeichert
« am: 28. April 2015, 18:25 »
Hallo Gemeinschaft

Vielleicht kann mir Jemand helfen??

Das Problem ist ein kleines Kopierprogramm für Linux ARM (Pi 2B)
Es soll als Dauerschleife laufen und ist in Assembler mit Linux syscall read und write.

Der Fehler:
das Programm macht 510 Schleifen und hört dann mit dem kopieren auf!

Das Programm ist aber in der Programmliste (top) noch aktiv (aber nur mit ca 1,7 prozent)

Hier nun der Code:
@------------------------------------------------------------------------------
@ Test pi 2B Programm twG (testen)
@ gcc -o twG twG.s
@------------------------------------------------------------------------------
@ as -o twG.o twG.s -> main ersetzen mit _start sonst Fehlermeldung
@ ld -o twG twG.o
@------------------------------------------------------------------------------

      .global main @ gcc -o

@       .global _start  @ as -o -> ld -o
     
.section .data
@------------------------------------------------------------------------------   

@------------------------------------------------------------------------------
   fd_in:
    .int 0x0
   fd_out:
    .int 0x0
@--------------------------
   reserve:
    .int 0x0
@----------parameter- sleep---------------------------------------------------
time_value:
.int 0 @ Sekunde
.int 2000000 @ 10mS /100mS  100000000

@------------------------------------ 
  file_reada:
    .asciz  "/dev/shm/A/B640x480rgb0"
  .align 2
@---write--------------------------   
  file_write2:
    .asciz  "/dev/shm/G/B640x480rgb0"
  .align 2

@------------------------------------------------------------------------------
  buffer_a:
  .space 1024*901
   
@-Ende section .data---------------------------------------------------------
@-----------------------------------------------------------------------------

main: @ gcc     
@ _start:      @ as -> ld
   mov r4 , #71 @ G
   mov r5 , #72 @ H
@-----------------------------------
   mov r3 , #65         @ A
   mov r6 , #66 @ B   
   mov r8 , #1024       @ schleife
   ldr r9 , =0x1 @ für Test
  ldr r10 , =18 @ für Test 18d

@-----------------------------------------------------------------------------

loop_neu:
@--open the file for reading---hole Bilddavor (/C/B640x480rgb0)---------------
      ldr r0 , =file_reada @
      strb r3 , [r0,#9] @ pfad A oder B
      mov r1 , #2 @ read
      ldr r2 , =444 @ all
      mov r7 , #5 @ syscall 5 open file
      swi 0
      ldr r1 , =fd_in
      str r0 , [r1] @ Rückgabe-Wert
@-----------------------------------------------------------------------------
@-- read from file------------------------------------------------------------
  @   ldr r1 , =fd_in
  @   ldr r0 , [r1] @ deskriptor fd_in
      ldr r1 , =buffer_a @ Zeiger -> Anfang der Daten
      mov r2 , #1024*900
      add r2 , #15 @ Anzahl Byte hier (900,0kiB 921615 Byte)
      mov r7 , #3 @ syscall 3 -> read file
      swi 0
@-----------------------------------------------------------------------------
@--close the file-------------------------------------------------------------
      mov r7 , #6
  @   ldr r1 , =fd_in
  @   ldr r0 , [r1] @ deskriptor fd_in
      swi 0
@------------------------------------------------------------------------------
str r9  , [r1, r10] @ r10 =ziel
add r9  , #1 @ kontrolle anzahl

@---lesen Ende-----------------------------------------------------------------
@-----create -----------------------------------------------------
ldr r0 , =file_write2
       strb r4 , [r0,#9] @ pfad G H
ldr r1 , =444
mov r7 , #8 @ syscall 8 create
swi 0
ldr r1 , =fd_out
str r0 , [r1]
@-----write file---------------------------
mov r2 , #1024*900
add r2 , #15
ldr r1 , =buffer_a @ Quelle (Ergebnis)
@@ ldr r1 , =fd_out
@@ str r0 , [r1]
mov r7 , #4 @ syscall write 4
swi 0
@------------------------------------------
@@ ldr r1 , =fd_out
@@ str r0 , [r1]
  mov r7 , #6 @ close
swi 0

@-----sleep sys 162 ----------------------------------------------------------
mov r7 , #162
ldr r0 , =time_value
mov r1 , #0
swi 0
@---------Test pfad read -----------------------------------------------------
add r3 , #1
cmp r3 , r6
ble pfadr_ok
sub r3 , #2
pfadr_ok:
@---------Test pfad write ----------------------------------------------------
add r4 , #1
cmp r4 , r5
ble pfad_ok
sub r4 , #2
pfad_ok:
@---------Durchlauf für Test--------------------------------------------------
@@ sub r8 , #1
@@ cmp r8 , #0
@@ bne loop_neu
b loop_neu @ max 0x01FE 510d -> warum ??
@-----------------------------------------------------------------------------

@--syscall exit 1 ------------------------------------------------------------
    mov r7 , #1
    mov r0 , #0
    swi 0 @ Ende   
     












Hilfen sind willkommen.

Gruß
Relbmessa

Relbmessa

  • Beiträge: 73
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 05. May 2015, 14:59 »
Hallo,
leider konnte mir im Moment Niemand helfen.

Zum Teil konnte ich mein Problem lösen.

Der Fehler FD-Überlauf entsteht durch das Auskomentieren von close.
Dadurch wird das Programm zwar schnell, aber fliegt beim Überlauf raus.
Das kontinuierliche schliessen der FDs bewirkt aber eine extreme
Verlangsamung vom Programm mit dem Faktor 9-10.
Kein Wunder das mein C-Programm zulangsam ist.
Diese Wirkung wird vom schliessen der read FD verursacht und
dadurch ist das Programm durch dass Auskommentieren schneller geworden.
(auch unbekümmertes Probieren kann Erfolg bringen)

Als Notlösung starte ich mein Programm mit einer kleinen Shell-Schleife immer
wieder neu.(der Speicher der FDs wird dabei gelöscht)

Mit der Lösung bin ich noch nicht ganz glücklich , aber kommt Zeit kommt Lösung

Danke für eure Aufmerksamkeit

Gruß
Relbmessa   
 

Relbmessa

  • Beiträge: 73
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 11. May 2015, 11:37 »
Hallo Leute,
ich habe das Problem gelöst.

Leider hat sich ein Denkfehler manifestiert.

Durch den Rückgabe Wert in R0 (EAX) wird der FD natürlich gelöscht.

Also  die  Schleife bei read beginnen und close (read) auskommentieren.
Den FD in r0 nicht vergessen.
Und write close muss ausgeführt werden (Kommentar entfernen nicht vergessen)
Die Pi-Kamera schaft wirklich 90 fps , allerdings wird der pi 2B ganz schön warm und stürtz dann ab.

Ich werde mir mal die Temperatur anschauen und es dann gegebenfalls mit Kühlung versuchen.

Gruß
Relbmessa   
« Letzte Änderung: 11. May 2015, 11:41 von Relbmessa »

 

Einloggen