2011-07-29 34 views
28

Tôi chỉ có BeagleBoard-Xm và tôi tự hỏi liệu có bước hướng dẫn chi tiết nào về cách lấy phần mềm kim loại trần đơn giản chạy trên phần cứng không? Lý do tôi hỏi là tôi muốn hiểu sâu sắc cách kiến ​​trúc phần cứng hoạt động, mọi thứ từ bộ nạp khởi động, trình liên kết, ngắt, ngoại lệ, MMU, v.v. Tôi đã tìm ra cách tốt nhất để có một chương trình hello world đơn giản để thực thi beagleboard xm không có hệ điều hành. Không có gì nâng cao, chỉ cần khởi động bảng và nhận được kết quả "hello world" trên màn hình. đó là nó!Lập trình kim loại trần Beagleboard

Bước tiếp theo sẽ nhận được một hệ điều hành nhỏ để chạy, có thể lên lịch một số tác vụ rất đơn giản. Không có hệ thống tập tin cần thiết, chỉ để hiểu những điều cơ bản của hệ điều hành.

Bất kỳ trợ giúp nào được đánh giá cao!

Trân trọng

Ông Gigu

Trả lời

40

Tuyệt đối không có vấn đề ...

tắt tiên nhận được cổng nối tiếp và chạy, tôi có một trong các beagleboards cũ/trước đó và nhớ cổng nối tiếp và tất cả mọi thứ về I/O là đau đớn, tuy nhiên vẫn có một cổng nối tiếp trên đó để bạn có thể thấy nó khởi động.

Khởi động uboot Tôi nghĩ và bạn có thể nhấn phím hoặc esc hoặc một cái gì đó tương tự để ngắt khởi động bình thường (thành Linux). Từ dấu nhắc uboot, thật dễ dàng để tải các chương trình đơn giản đầu tiên của bạn.

Tôi có một số mã beagleboard tiện dụng tại thời điểm này nhưng không có beagleboard của tôi chính nó tiện dụng để thử chúng. Vì vậy, hãy truy cập http://sam7stuff.blogspot.com/ để có ý tưởng về cách kết hợp một số bộ mã hóa khởi động và mã C cho các chương trình nhúng OSless (cho cánh tay, tôi có một số ví dụ cho các nền tảng thumb/cortex-m3 khác, nhưng những khởi động này hơi khác một chút) .

Cổng sam7 cho mọi thứ và không gian địa chỉ bộ nhớ hoàn toàn khác với beagleboard/omap. Ở trên là một khuôn khổ mà bạn có thể thay đổi hoặc tái phát minh.

Bạn sẽ cần hướng dẫn tham khảo kỹ thuật OMAP 35x từ ti.com. Tìm kiếm phần omap trên trang web OMAP3530 của họ.

Cũng là tài liệu beagleboard. Ví dụ tuyên bố này:

Một cổng RS232 duy nhất được cung cấp trên BeagleBoard và cung cấp truy cập vào các TX và dòng RX của UART3

Vì vậy, trong trm cho OMAP tìm kiếm UART3 cho thấy rằng nó là một địa chỉ cơ sở của 0x49020000. (thường rất khó để tìm ra toàn bộ địa chỉ cho một cái gì đó như các hướng dẫn thường có một phần của bản đồ bộ nhớ ở đây, và một phần khác ở đó, và gần các mô tả đăng ký chỉ các bit thấp hơn của địa chỉ được gọi ra.)

Nhìn vào thanh ghi uart THR_REG là nơi bạn viết các byte được gửi ra khỏi uart, lưu ý rằng đó là thanh ghi 16 bit.

Biết được điều này chúng ta có thể làm cho chương trình đầu tiên:

.globl _start 
_start: 
    ldr r0,=0x49020000 
    mov r1,#0x55 
    strh r1,[r0] 
    strh r1,[r0] 
    strh r1,[r0] 
    strh r1,[r0] 
    strh r1,[r0] 
hang: b hang 

Đây là một makefile cho nó:

ARMGNU = arm-none-linux-gnueabi 

AOPS = --warn --fatal-warnings 
COPS = -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding 

uarttest.bin : uarttest.s 
    $(ARMGNU)-as $(AOPS) uarttest.s -o uarttest.o 
    $(ARMGNU)-ld -T rammap uarttest.o -o uarttest.elf 
    $(ARMGNU)-objdump -D uarttest.elf > uarttest.list 
    $(ARMGNU)-objcopy uarttest.elf -O srec uarttest.srec 
    $(ARMGNU)-objcopy uarttest.elf -O binary uarttest.bin 

Và kịch bản mối liên kết được sử dụng:

/* rammap */ 
MEMORY 
{ 
    ram : ORIGIN = 0x80300000, LENGTH = 0x10000 
} 

SECTIONS 
{ 
    .text : { *(.text*) } > ram 
} 

Note phiên bản Linux từ codesourcery được gọi ra, bạn không cần phiên bản đó của trình biên dịch chéo gnu, trên thực tế, mã của ông được asm chỉ cần một assembler và linker (binutils stuff). Trình biên dịch chéo kiểu arm-no-eabi -... sẽ hoạt động tốt (giả sử bạn có được các công cụ lite từ codesourcery).

Khi bạn có tệp .bin tại trợ giúp trên uboot, tôi không nhớ lệnh chính xác nhưng có thể là l 0x80300000 hoặc load_xmodem hoặc một số thứ như vậy. Về cơ bản bạn muốn x, hoặc y hoặc z modem tập tin .bin qua cổng nối tiếp vào không gian bộ nhớ cho bộ vi xử lý, sau đó sử dụng lệnh đi hoặc bất kỳ lệnh nào được yêu cầu uboot để nhánh cho chương trình của bạn.

Bạn sẽ thấy một số ít ký tự U (0x55 là 'U') xuất hiện cổng nối tiếp khi chạy.

Mục tiêu chính của bạn là tạo một cổng nối tiếp đơn giản để bạn có thể in nội dung ra để gỡ lỗi và xem các chương trình của bạn đang làm gì. Sau đó bạn có thể nhận được vào đồ họa, vv nhưng đầu tiên sử dụng cổng nối tiếp.

Có một số gian lận xảy ra. Vì uboot đã xuất hiện và khởi tạo cổng nối tiếp mà chúng ta không cần phải, chỉ cần chuyển byte vào Thr. nhưng nhanh chóng bạn sẽ tràn bộ nhớ của thr và mất byte, vì vậy bạn cần phải đọc trm cho omap và tìm một số bit cho biết bộ phát trống, nó đã truyền mọi thứ, sau đó tạo một hàm uart_send để thăm dò phát trống sau đó gửi một byte ra.

cũng quên về printf(), bạn cần tạo một bản in của riêng mình một số (bát phân hoặc hex là số dễ nhất) và có lẽ là chuỗi in. Tôi làm loại công việc này cả ngày và cả đêm và 99% thời gian tôi sử dụng là một thói quen nhỏ in các số hex 32 bit ra khỏi uart. từ những con số tôi có thể gỡ lỗi và xem trạng thái của chương trình.

Vì vậy, hãy lấy mẫu sam7 hoặc một cái gì đó giống như nó (lưu ý trình biên dịch và tùy chọn dòng lệnh liên kết quan trọng như thứ tự của tệp trên dòng lệnh liên kết, tệp đầu tiên phải là điểm nhập của bạn nếu bạn muốn có hướng dẫn/từ đầu tiên trong tệp .bin là điểm vào của bạn, thường là một ý tưởng hay khi xuống đường bạn muốn biết cách kiểm soát việc này để khởi động từ rom).

Bạn có thể làm khá một chút mà không cần gỡ bỏ hoặc thay thế uboot, nếu bạn bắt đầu xem các lệnh khởi động dựa trên Linux cho uboot bạn sẽ thấy rằng nó đang sao chép một tệp .bin từ flash hoặc một nơi nào đó một chỗ trong ram, sau đó phân nhánh nó. Bây giờ phân nhánh để linux, esp cánh tay linux liên quan đến một số bảng cánh tay và có thể thiết lập một số đăng ký, nơi mà các chương trình của bạn sẽ không muốn hoặc cần điều đó. về cơ bản bất kỳ lệnh nào bạn tìm ra để sử dụng, sau khi bạn đã sao chép chương trình của bạn thành ram, là những gì bạn sẽ kịch bản trong một kịch bản khởi động cho uboot bạn nên chọn để khởi động bo mạch và chạy giống như nó với Linux.

Nói rằng bạn có thể sử dụng jtag và không dựa vào uboot để làm việc, khi bạn đi đường dẫn đó mặc dù có khả năng một số thứ nhất định bạn phải thực hiện khi khởi động để khởi động và chạy chip, cụ thể là định cấu hình uart có thể là một vài ngăn đồng hồ ở đâu đó, đồng hồ cho phép, I/O cho phép, những thứ khác nhau như thế.Đó là lý do tại sao ví dụ sam7 bắt đầu bằng một cái chớp dẫn đầu thay vì một thứ uart. Các amotk jtag-tiny là một wiggler jtag tốt, tôi đã khá hài lòng, sử dụng tất cả các ngày dài mỗi ngày tại nơi làm việc. Các beagleboard có thể sử dụng một pinout TI và không phải là pin ARM tiêu chuẩn, do đó bạn có thể sẽ cần phải thay đổi cáp. Và tôi không biết nếu OMAP cung cấp cho bạn truy cập trực tiếp vào bộ điều khiển vòi tay hoặc nếu bạn phải làm một cái gì đó ti cụ thể. Bạn tốt hơn là chỉ đi tuyến đường uboot trong thời gian này.

Khi bạn có một khung nơi bạn có một lượng nhỏ asm để thiết lập ngăn xếp và nhánh thành mã C của điểm nhập cảnh, bạn có thể bắt đầu biến mã C đó thành một hệ điều hành hoặc làm bất cứ điều gì bạn muốn. Nếu bạn nhìn vào chibios hoặc prex hoặc những người khác thích nó, bạn sẽ thấy họ có mã khởi động asm nhỏ để đưa chúng vào hệ thống của họ. Tương tự như vậy có gỡ lỗi uart và không gỡ lỗi thói quen trong đó. Nhiều rtoses sẽ muốn sử dụng các ngắt và không phải thăm dò ý kiến ​​cho thr để trống.

Nếu bài đăng này không giúp bạn và chạy với thế giới hello của bạn (cho phép bạn làm một số công việc), hãy cho tôi biết và tôi sẽ đào beagleboard của tôi và tạo một ví dụ hoàn chỉnh. Bảng của tôi không chính xác phù hợp với bạn nhưng xa như thế giới hello đi nó phải là đủ gần.

+0

Wow, đây là công cụ tuyệt vời! Cảm ơn bạn đã dành thời gian để giúp tôi, đánh giá cao! Ngay sau khi tôi hoàn thành luận án của mình, tôi sẽ bắt đầu đào sâu vào điều này và cố gắng làm cho nó hoạt động! Có lẽ tôi nên mua một Jtag để gỡ lỗi beagleboard của tôi! Cảm ơn một lần nữa! – MrGigu

+0

Cuối cùng tôi đã tìm thấy thời gian để chơi với bảng và làm cho nó hoạt động! Bây giờ tôi có thể xuất một số văn bản trên bàn điều khiển :) Có ai đó cũng đã sử dụng bài đăng này làm tài liệu tham khảo cho hướng dẫn kim loại trần của mình, bạn nghĩ rằng bạn muốn biết! http://wiki.osdev.org/Beagleboard. Cảm ơn AGAIN – MrGigu

+0

@ dwelch, dude bạn là tất cả trên thế giới hệ thống nhúng. một lần nữa công cụ tuyệt vời. bây giờ nếu tôi thấy một câu trả lời/bài viết hay, tôi có thể đoán được bạn. – deepak