Sử dụng Raspberry Pi mà không có hệ điều hành Linux?


33

Tôi quan tâm đến việc sử dụng Raspberry Pi như một đơn vị CPU nhúng thuần túy, để phát triển các ứng dụng nhúng. Vì Raspberry Pi có CPU mạnh mẽ với khá nhiều bộ nhớ, nó tạo nên một bảng nhúng tuyệt vời.

Có thể sử dụng Raspberry Pi mà không cần hệ điều hành Linux? Tôi có thể làm cái này như thế nào?


2
Tôi không nghĩ rằng đây là một câu hỏi thực sự và không phù hợp với định dạng Hỏi và Đáp.
Alex Chamberlain

5
Tại sao không? Bạn không nghĩ mọi người có thể hỏi về việc sử dụng RaPi theo bất kỳ cách nào khác ngoài hệ điều hành Linux? Trường hợp trong danh sách các quy định của nhóm này có một phần nói rằng người ta không thể hỏi những câu hỏi như vậy?
FarhadA

2
Tôi đã không nói điều đó. Tôi thực sự nghĩ rằng sẽ rất tuyệt khi thấy một số dự án không sử dụng Linux, nhưng bạn không thực sự đặt câu hỏi với câu trả lời dứt khoát, thay vào đó bạn đã đưa ra một điểm thảo luận.
Alex Chamberlain

@AlexChamberlain Tôi đồng ý - Tôi đã chỉnh sửa nó thành một câu hỏi. FarhadA - Tôi hy vọng điều này là ổn, ở trạng thái hiện tại, nó sẽ bị đóng cửa. Vui lòng xem lại và cải thiện chỉnh sửa của tôi!
Alex L

Ok, đúng, tôi phải đặt câu hỏi, vì đây là trang web Hỏi & Đáp :)
FarhadA

Câu trả lời:


23

Tôi đã xem xét lập trình kim loại trần trên Raspberry Pi và nó có vẻ giống như những gì bạn muốn làm. Có một số chủ đề diễn đàn tốt về lập trình kim loại trần với một số người đã nỗ lực rất nhiều để làm cho mã của họ hoạt động. Kiểm tra những điều này để bắt đầu:

Hướng dẫn bắt đầu Bare Metal trên Raspi

Lập trình RPi trên kim loại trần

Lập trình cơ bản trên Bare Metal Tutorial 1

hoặc nói chung, bạn có thể truy cập Diễn đàn Bare Metal của Raspberry Pi và chỉ cần duyệt qua.

Tôi hiểu rằng bạn sẽ phải khởi động từ thẻ SD do trình tự khởi động được tích hợp trong chip Broadcom. Tôi đang cố gắng tìm liên kết cho chuỗi khởi động nhưng google fu của tôi không hoạt động, tôi sẽ chỉnh sửa sau nếu tôi tìm thấy.


3
Ngoài ra, bạn có thể sử dụng hướng dẫn này: cl.cam.ac.uk/freshers/raspberrypi/tutorials/os đó là về việc xây dựng một hệ điều hành, nhưng nếu bạn mở rộng ý tưởng về một hệ điều hành, nó có thể được áp dụng cho các hệ thống nhúng.
ohblahitsme

6

cách duy nhất nó sẽ khởi động là từ một sdcard được định dạng fat32, đi từ tải phần mềm poweron sang gpu thực thi bất kỳ tệp nhị phân nhánh nào có tên kernel.img, vì vậy nếu bạn muốn tạo một kernel tùy chỉnh mà bạn đang làm bất cứ điều gì bạn đang muốn làm tại điểm này


3
Có, nhưng đó không phải là điều tôi muốn làm, tôi muốn biết liệu có thể thay đổi mã khởi động của chip hay không, thay vì đi đến thẻ SD để tìm hình ảnh khởi động, nó có thể được thay đổi để đi đến thay vào đó là một bộ nhớ flash SPI và khởi động từ đó. Bằng cách này, mã khởi động có thể nằm trên bộ nhớ flash SPI như AT25FS040 hoặc AT25DF641 hoặc các đơn vị tương tự khác. Đối với các ứng dụng nhúng, những ứng dụng này đủ để lưu trữ tất cả mã và chúng có thể được tải vào SDRAM sau khi khởi động. nhưng thách thức lớn là thay đổi mã ROM khởi động.
FarhadA

9
Đó không phải là những gì bạn hỏi trong câu hỏi của bạn cả.
Alistair Buxton

Tôi biết, nhưng kiến ​​thức của tôi về trình tự khởi động RaPi còn hạn chế, tôi đã có câu hỏi thích hợp trong câu hỏi ban đầu của mình trước khi nó được bỏ phiếu và chỉnh sửa theo định dạng hiện tại này.
FarhadA

2
@FarhadA - Nhận xét đầu tiên của bạn ở đây có vẻ như nó sẽ là một câu hỏi thực tế, có thể trả lời theo đúng nghĩa của nó. Nó chắc chắn sẽ tốt hơn khi hình thức ban đầu của câu hỏi này.
Đánh dấu gian hàng

Vâng, như tôi đã nói, kiến ​​thức của tôi về trình tự khởi động RasPi còn hạn chế. Tôi đang nghiêng về việc tạo một tệp khởi động đơn giản trên thẻ SD và tải ứng dụng từ đèn flash dựa trên SPI trên bảng mở rộng của riêng tôi. Tôi thực sự không thích có thẻ SD trong hệ thống của mình, nhưng dường như đó là cách duy nhất nhanh chóng và bẩn thỉu. Bây giờ tôi cần học cách tạo mã khởi động đơn giản cho RasPi :)
FarhadA

4

Tôi đã tạo một trình giả lập IBM S / 390 trong C # về mặt lý thuyết sẽ chạy trong Mono / Linux khi nó biên dịch thành mã CIL và không sử dụng bất kỳ tài nguyên .NET không được hỗ trợ nào. Điều này sẽ cho phép các giải pháp nhúng sử dụng các bảng điều khiển độc lập nền tảng với trình thông dịch máy trạng thái hữu hạn tùy chỉnh. Mặc dù vậy, nó vẫn sẽ có Linux O / S thiết yếu trong nền.


2

Ví dụ hoàn toàn tự động tối thiểu kim loại trần

Đã thử nghiệm trên máy chủ Ubuntu 16.04, Raspberry Pi 2. Cách sử dụng:

  1. Lắp thẻ SD vào máy chủ

  2. Tạo hình ảnh:

    ./make.sh /dev/mmblck0 p1
    

    Ở đâu:

    • /dev/mmblck0 là thiết bị của thẻ SD
    • p1là phân vùng đầu tiên của thiết bị ( /dev/mmblck0p1)
  3. Thẻ SD khởi động trên PI

  4. Tắt và bật nguồn

nhập mô tả hình ảnh ở đây

Ngược dòng GitHub: https://github.com/cirosantilli/raspberry-pi-bare-metal-blinker/tree/d20f0337189641824b3ad5e4a688aa91e13fd764

bắt đầu

.global _start
_start:
    mov sp, #0x8000
    bl main
hang:
    b hang

C chính

#include <stdint.h>

/* This is bad. Anything remotely serious should use timers
 * provided by the board. But this makes the code simpler. */
#define BUSY_WAIT __asm__ __volatile__("")
#define BUSY_WAIT_N 0x100000

int main( void ) {
    uint32_t i;
    /* At the low level, everything is done by writing to magic memory addresses. */
    volatile uint32_t * const GPFSEL4 = (uint32_t *)0x3F200010;
    volatile uint32_t * const GPFSEL3 = (uint32_t *)0x3F20000C;
    volatile uint32_t * const GPSET1  = (uint32_t *)0x3F200020;
    volatile uint32_t * const GPCLR1  = (uint32_t *)0x3F20002C;

    *GPFSEL4 = (*GPFSEL4 & ~(7 << 21)) | (1 << 21);
    *GPFSEL3 = (*GPFSEL3 & ~(7 << 15)) | (1 << 15);
    while (1) {
        *GPSET1 = 1 << (47 - 32);
        *GPCLR1 = 1 << (35 - 32);
        for (i = 0; i < BUSY_WAIT_N; ++i) { BUSY_WAIT; }
        *GPCLR1 = 1 << (47 - 32);
        *GPSET1 = 1 << (35 - 32);
        for (i = 0; i < BUSY_WAIT_N; ++i) { BUSY_WAIT; }
    }
}

bản thảo

MEMORY
{
    ram : ORIGIN = 0x8000, LENGTH = 0x10000
}

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

làm cho

#!/usr/bin/env bash

set -e

dev="${1:-/dev/mmcblk0}"
part="${2:-p1}"
part_dev="${dev}${part}"
mnt='/mnt/rpi'

sudo apt-get install binutils-arm-none-eabi gcc-arm-none-eabi

# Generate kernel7.img
arm-none-eabi-as start.S -o start.o
arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -c main.c -o main.o
arm-none-eabi-ld start.o main.o -T ldscript -o main.elf
# Get the raw assembly out of the generated elf file.
arm-none-eabi-objcopy main.elf -O binary kernel7.img

# Get the firmware. Those are just magic blobs, likely compiled
# from some Broadcom proprietary C code which we cannot access.
wget -O bootcode.bin https://github.com/raspberrypi/firmware/blob/597c662a613df1144a6bc43e5f4505d83bd748ca/boot/bootcode.bin?raw=true
wget -O start.elf https://github.com/raspberrypi/firmware/blob/597c662a613df1144a6bc43e5f4505d83bd748ca/boot/start.elf?raw=true

# Prepare the filesystem.
sudo umount "$part_dev"
echo 'start=2048, type=c' | sudo sfdisk "$dev"
sudo mkfs.vfat "$part_dev"
sudo mkdir -p "$mnt"
sudo mount "${part_dev}" "$mnt"
sudo cp kernel7.img bootcode.bin start.elf "$mnt"

# Cleanup.
sync
sudo umount "$mnt"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.