printacii 와 printhex 출력 log 를 직렬 로 사용 합 니 다.
직렬 콘 솔 suspend 시 커 널 c 언어 함수 printk 에서 로 그 를 출력 할 수 없습니다.
linux 2.3.0 버 전, arm 구조 아래 두 개의 어 셈 블 리 함수 printassii 와 printhex 가 있 습 니 다. log 디 버 깅 에 사용 할 수 있 습 니 다.
arm 어 셈 블 리 명령 으로 작 성 된 것 이기 때문에 arm 구조 플랫폼 만 지원 합 니 다.
파일 위치: / arch / arm / kernel / debug. S
ENTRY(printascii)
addruart_current r3, r1, r2
b 2f
1: waituart r2, r3
senduart r1, r3
busyuart r2, r3
teq r1, #'
'
moveq r1, #'\r'
beq 1b
2: teq r0, #0
ldrneb r1, [r0], #1
teqne r1, #0
bne 1b
mov pc, lr
ENDPROC(printascii)
이 함 수 는 menu config 에서 매크로 정 의 를 열 어야 합 니 다: CONFIGDEBUG_LL
이 매크로 를 열 면 log 가 많 기 때문에 직접 편집 하 는 것 을 권장 합 니 다: / arch / arm / kernel / Makefile
obj - y 뒤에 하나 추가: debug. o
이렇게 하면 이 두 함수 어 셈 블 리 파일 을 직접 호출 할 수 있 습 니 다.
#ifdef CONFIG_DEBUG_LL
adr r0, str_p1
bl printascii
mov r0, r9
bl printhex8
adr r0, str_p2
bl printascii
b __error
str_p1: .asciz "
Error: value = (0x"
str_p2: .asciz ").
"
.align
#endif
printacii 는 ascii 코드 문자열 만 인쇄 할 수 있 고 변수 값 을 인쇄 할 수 없습니다. 변 수 는 ldr 를 통 해 레지스터 에 인쇄 한 다음 printhex 를 통 해 인쇄 할 수 있 습 니 다.
c 언어 에서 직접 이렇게 사용:
extern void printascii(const char *);
void s3c_pm_dbg(const char *fmt, ...)
{
va_list va;
char buff[256];
va_start(va, fmt);
vsprintf(buff, fmt, va);
va_end(va);
#ifdef CONFIG_DEBUG_LL
printascii(buff);
#endif
}
vsprintf 를 사용 하여 문자열 과 변 수 를 buff 에 저장 한 다음 printassii 를 통 해 직렬 로 보 냅 니 다!
제 개발 판 은 exynos 4412 입 니 다. u - boot 에서 직렬 포트 를 직접 설정 하면 하나의 문 자 를 인쇄 할 수 있 습 니 다.
/*
* uart_asm_init: Initialize UART in asm mode, 115200bps fixed.
* void uart_asm_init(void)
*/
.globl uart_asm_init
uart_asm_init:
/* set GPIO to enable UART */
@ GPIO setting for UART for UART0/1/2/3
ldr r0, =0x11400000
ldr r1, =0x22222222
str r1, [r0]
ldr r0, =0x11400020
ldr r1, =0x222222
str r1, [r0]
ldr r0, =S5PV310_CLOCK_BASE
ldr r1, =CLK_SRC_PERIL0_VAL
ldr r2, =CLK_SRC_PERIL0_OFFSET
str r1, [r0, r2]
ldr r1, =CLK_DIV_PERIL0_VAL
ldr r2, =CLK_DIV_PERIL0_OFFSET
str r1, [r0, r2]
ldr r0, =S5PV310_UART_CONSOLE_BASE
ldr r1, =0x111
str r1, [r0, #UFCON_OFFSET]
mov r1, #0x3
str r1, [r0, #ULCON_OFFSET]
ldr r1, =0x3c5
str r1, [r0, #UCON_OFFSET]
ldr r1, =UART_UBRDIV_VAL
str r1, [r0, #UBRDIV_OFFSET]
ldr r1, =UART_UDIVSLOT_VAL
str r1, [r0, #UDIVSLOT_OFFSET]
ldr r1, =0x4f4f4f4f
str r1, [r0, #UTXH_OFFSET] @'O'
직렬 레지스터 설정 0x 1140000, 0x 11400020 등 직렬 포트 초기 화
ldr r0, =S5PV310_UART_CONSOLE_BASE 는 urt 1 과 같은 플랫폼 정의 log 출력 포트 를 가 져 옵 니 다.
마지막 두 줄 은 인쇄 문자 'O', UTXH 입 니 다.OFFSET 레지스터 는 8bit 만 받 을 수 있 기 때문에 한 글자 만 인쇄 할 수 있 습 니 다.
urt 가 초기 화 된 후에 우 리 는 이렇게 사용 할 수 있 습 니 다. 'K' 문 자 를 인쇄 할 수 있 습 니 다.
/* Print 'K' */
ldr r0, =S5PV310_UART_CONSOLE_BASE
ldr r1, =0x4b4b4b4b
str r1, [r0, #UTXH_OFFSET]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.