2013-06-22 2 views
2

다음은 Baking Pi이며 라스베리 파이에 대한 ARMv6 어셈블리에는 매우 기본적인 운영 체제를 구축하고 있습니다. GPIO 컨트롤러를 통해 OK LED를 켜고 시스템 타이머를 사용하여 깜박이도록하고 .int 값에 저장된 비트 맵이 나타내는 패턴에 따라 깜박이도록했습니다. 이 마지막 솔루션은 제대로 작동하지 않습니다. 처음에 나는 문제를 잘못 풀었어야한다고 생각했지만 기능적 솔루션 인 provided here으로 솔루션을 점검하는 데 아무리 큰 차이가 있는지는 확인할 수 없습니다.라스베리 파이의 SOS 모스 코드 OK LED가 작동하지 않습니다.

나는 실제 솔루션을 다운로드하고 마지막으로 다운로드하여 컴파일하고 내 파이에 설치했습니다. 그것은 내 자신의 솔루션과 동일한 깨진 행동을 보여줍니다. 즉, LED가 켜지지만 계속 켜져 있습니다. 나는 그 프로그램이 추락했다고 생각하거나, and 지시가 교사가하고 싶어하는 것을하지 않고있다.

이 같은 같은 솔루션 :

bitmap .req r4 
seq  .req r5 
ldr bitmap,=pattern 
ldr bitmap,[bitmap] 
mov seq,#0   /* start at the zeroth bit */ 

loop$: 
    mov r0,#16  /* set gpio pin 16: OK LED */ 
    mov r1,#1  /* bitmask starts with a 1 */ 
    lsl r1,seq  /* shift to the correct bit */ 
    and r1,bitmap /* mask according to the pattern */ 
    bl SetGpio  /* set the LED state (r1 zero = off, non-zero = on) */ 
    bl Wait   /* wait for a short interval */ 
    add seq,#1  /* increment the sequence counter */ 
    and seq,#0b11111 /* reset seq to 0 if >= 32 */ 
    b loop$   /* loop forever */ 

.section .data 

.align 2 
pattern: 
    .int 0b11111111101010100010001000101010 

가 지금은 이전의 교훈은 단지 깜빡 이후 WaitSetGpio 기능은 내가 EOR에 의해 수행 된 설정 간격으로 켜고 LED, 제대로 알고 ' 1 회 또는 0 회 loop$의 반복마다 1을 가짐. 여기서 소개 된 유일한 중요한 개념은 SOS 패턴을 나타내는 비트 맵입니다. 저는 비트 맵과 비트 마스크에 익숙합니다. 더 높은 수준의 언어에서 규칙적으로 사용하기 때문에 논리가 괜찮다고 생각합니다. 그러나 .int이 저장/패딩되는 방법과 어울리는 다른 점이 있습니까?

위의 논리에 문제가있는 것이 있습니까? SetGpio 계약은 :

R0이 경우에는 GPIO 핀 번호로 설정해야
  • 16
  • 밖의 LED가되어야하는 경우, R1은 비 - 제로로 설정되어야
  • 제로를 해제하는
    • 반환 값은 중요하지 않습니다

    Wait 기능은 다음과 같습니다

    /* Sleep for 500 milliseconds */ 
    Wait: 
        push {lr} 
        ldr r0,=500 
        bl SleepForDelay 
        pop {pc} 
    

    EDIT | 사실, 모두 내에서 beavhiour과 교사의 솔루션은 다음과 같습니다

    1. LED는 (점, 나는 추측)
    2. LED가 다시 꺼집니다 다시
    3. LED가 켜지고 켜져 짧은 간격에 온다 영원히

    실제로 나는 첫 번째 깜박임이 부팅 로더 일 뿐이라고 생각했지만, 내 프로그램의 초기에 의도적 인 충돌을 도입하면 LED가 전혀 켜지지 않습니다.

  • +1

    대기 함수에 인수가 필요합니까? r0에? –

    +0

    @ dwelch 직접적으로. 그러나 다른 기능을 호출하지만 자체적으로 설정합니다. – d11wtq

    +1

    Wait 구현을 질문에 추가했습니다. – d11wtq

    답변

    1

    이 점은 코드와 아무 관련이 없으며 실제로 라스베리 파이의 구성 설정이었습니다.

    /config.txt 필요 kernel_old=1.

    관련 문제