printacii 와 printhex 출력 log 를 직렬 로 사용 합 니 다.

3534 단어 android디 버 깅
옮 겨 싣 기 원본 주 소 를 표시 하 십시오:http://blog.csdn.net/uranus_wm/article/details/11176877
 
직렬 콘 솔 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]

좋은 웹페이지 즐겨찾기