[問題]arm-linux-gcc s3c6410 可以開機就run程式不跑系統嗎? help

看板LinuxDev作者 (=口="被發現了!)時間14年前 (2011/04/01 10:09), 編輯推噓7(7022)
留言29則, 5人參與, 最新討論串1/1
你好!! 下面是我目前爬文 看到ARM9有code 可以把led.c檔 轉成 led.bin檔 透過sd卡 燒錄到IC 0x00000000 地址 這樣開機過後就可以直接 驅動IO port 執行程式 http://www.dmatek.com.cn/bbs/Announce/Announce.asp?BoardID=10&ID=3285&p=12&Upflag=1&q=1&r=2083 我是參考這個 -------先SHOW出我編譯最後的結果 make------- root@rit-EELAB:/home/rit/linux_system/arm_start_test# make /usr/local/arm/4.3.1-eabi-armv6/usr/bin/arm-linux-gcc -g -c -o crt0.o crt0.S /usr/local/arm/4.3.1-eabi-armv6/usr/bin/arm-linux-gcc -g -c -o S0321.o S0321.c /usr/local/arm/4.3.1-eabi-armv6/usr/bin/arm-linux-ld -Ttext 0x00000000 -g crt0.o S0321.o -o S0321_elf S0321.o: In function `main': /home/rit/linux_system/arm_start_test/S0321.c:48: undefined reference to `printf' make: *** [S0321.bin] Error 1 root@rit-EELAB:/home/rit/linux_system/arm_start_test# 可以編譯出 S0321.o crt0.o 然後計沒了@@ -------以下是我的程式------- <makefile> { CC = /usr/local/arm/4.3.1-eabi-armv6/usr/bin/arm-linux- ARCH = arm 6410X_KERNEL_DIR = /home/rit/linux_system/dma6410L-linux-2.6.27 export PATH=/usr/local/arm/4.3.1-eabi-armv6/usr/bin/:$PATH S0321.bin: crt0.S S0321.c $(CC)gcc -g -c -o crt0.o crt0.S $(CC)gcc -g -c -o S0321.o S0321.c $(CC)ld -Ttext 0x00000000 -g crt0.o S0321.o -o S0321_elf $(CC)objcopy -O binary -S S0321_elf S0321.bin clean: rm -f *.ko *.o *.bak *.mod.* *.bin *_elf } <S0321.c> { #include <common.h> #include <exports.h> #include <stdio.h> #include <stdlib.h> int main(void) { printf("Hello, world!\n"); return 0; } } <crt0.S> { .text .global _start _start: ldr r0, =0x7E004000 mov r1, #0x0 str r1, [r0] ldr sp, =1024*4 bl main halt_loop: b halt_loop } 謝謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.23.55.19

04/01 23:33, , 1F
既然弄到這麼底層, 你要在深入一點, printf之所以能print
04/01 23:33, 1F

04/01 23:34, , 2F
也是因為有底曾function支援, UART, putchar, print_strin
04/01 23:34, 2F

04/01 23:35, , 3F
這些library都沒link到的話, 他是怎麼會自動show 字串出來
04/01 23:35, 3F

04/02 14:45, , 4F
推樓上,自己寫printf函式對應到你的輸出裝置,UART或是LCD
04/02 14:45, 4F

04/02 14:51, , 5F
另外,你都要自己跳轉到main了,應該也就沒必要再include
04/02 14:51, 5F

04/02 14:57, , 6F
標準函式庫的東西了...
04/02 14:57, 6F

04/02 15:16, , 7F
原po可以參考一下uboot的printf怎麼做的...
04/02 15:16, 7F

04/05 00:24, , 8F
你可能要先看一下datasheet或是其他的source code,者出如何
04/05 00:24, 8F

04/05 00:24, , 9F
設定你的uart...如果你知道uart是怎樣運作的話,其實就算不寫
04/05 00:24, 9F

04/05 00:26, , 10F
printf也可以把文字印出來..
04/05 00:26, 10F

04/05 00:27, , 11F
如果要作non-OS的程式,個人建議不要include C library的東西
04/05 00:27, 11F

04/05 00:27, , 12F
除非你很清楚知道你要做的是什麼...
04/05 00:27, 12F

04/05 00:49, , 13F
以原PO的情況,要看到"Hello, world!"重點在於UART設定好了沒
04/05 00:49, 13F

04/05 00:50, , 14F
而不是printf這個function的實做..
04/05 00:50, 14F

04/08 16:29, , 15F
libc 在你的 toolchain 裡面就有了.. 找到然後設定連結..
04/08 16:29, 15F

04/08 16:32, , 16F
原來沒OS..搞錯
04/08 16:32, 16F

04/08 16:39, , 17F
各位大大好~ 我現在把程式加在u-boot裡
04/08 16:39, 17F

04/08 16:40, , 18F
目前是用U-BOOT改 可以做到開機直接執行的效果
04/08 16:40, 18F

04/08 16:41, , 19F
我覺得是原來那個檔案是library都沒正確link到
04/08 16:41, 19F

04/08 16:42, , 20F
加上編譯出來的程式 沒將IC初始化 也不能用
04/08 16:42, 20F

04/08 16:43, , 21F
總之 我把程式附加在 原本要編譯u-boot的檔案裡
04/08 16:43, 21F

04/08 16:44, , 22F
感謝!
04/08 16:44, 22F

04/08 17:13, , 23F
你原先的那個程式就等於一個超小型的uboot:)
04/08 17:13, 23F

04/08 17:15, , 24F
那隻組語裡面 bl main幫你跳轉到main取代了本來C library
04/08 17:15, 24F

04/08 17:18, , 25F
連結之後幫你跳轉main的步驟,u-boot也是在start.s裡幫你
04/08 17:18, 25F

04/08 17:18, , 26F
跳轉到C code的入口點函式start_armboot
04/08 17:18, 26F

04/08 17:20, , 27F
原PO有興趣的話可以研究一下標準C lib怎麼幫你轉到main()
04/08 17:20, 27F

04/08 17:20, , 28F
會發現你的那個組語crt0.S 其命名是有點意義的:)
04/08 17:20, 28F

04/11 10:49, , 29F
感謝!
04/11 10:49, 29F
文章代碼(AID): #1DbQHcMM (LinuxDev)