首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Raspberry Pi上运行没有OS的C程序?

如何在Raspberry Pi上运行没有OS的C程序?
EN

Stack Overflow用户
提问于 2015-04-23 18:48:58
回答 4查看 41.1K关注 0票数 42

我想在一些不同的低级别嵌入式应用程序中使用Raspberry Pi进行实验。唯一的问题是,与现有的AVR和PIC微控制器板不同,Raspberry Pi通常运行一个操作系统(如Raspbian),它在所有运行的程序中分配CPU时间,使得某些实时应用程序不切实际。

最近我了解到,假设安装了像GRUB这样的引导加载程序,那么在x86 (以内核的形式)上运行C程序只需要很少的实际设置,只需要一个程序集来调用主函数和实际的C代码。

有没有办法用树莓Pi来达到这个目的?这将是学习底层ARM编程的一个很好的方法,而且它已经有一些复杂的外围设备可以处理(USB、以太网等)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-10-15 10:59:55

全自动最小裸金属闪光灯示例

在Ubuntu 16.04寄主Raspberry Pi 2上进行了测试。

https://github.com/dwelch67/raspberrypi是我迄今所见过的最全面的示例集(在本现在删除答案中已经提到过),但是这是一个很容易设置hello以使您快速入门的示例集。

用法:

  1. 在主机上插入SD卡
  2. 制作图像: ./make.sh /dev/mmblck0 p1 其中:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- `/dev/mmblck0` is the device of the SD card
- `p1` is the first partition of the device (`/dev/mmblck0p1`)

  1. PI上嵌入SD卡
  2. 断电断电

上游GitHub:https://github.com/cirosantilli/raspberry-pi-bare-metal-blinker/tree/d20f0337189641824b3ad5e4a688aa91e13fd764

start.S

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.global _start
_start:
    mov sp, #0x8000
    bl main
hang:
    b hang

main.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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.
    The device tree files (dtb / dts), which are provided by hardware vendors,
    tell the Linux kernel about those magic values. */
    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; }
    }
}

ldscript

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MEMORY
{
    ram : ORIGIN = 0x8000, LENGTH = 0x10000
}

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

make.sh

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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"

QEMU友好裸金属示例

闪光灯的问题是很难观察到QEMU:https://raspberrypi.stackexchange.com/questions/56373/is-it-possible-to-get-the-state-of-the-leds-and-gpios-in-a-qemu-emulation-like-t中的发光二极管。

在这里,我描述了一些可能感兴趣的裸金属QEMU设置:如何制作裸金属臂程序并在QEMU上运行?写入UART是从QEMU获得输出的最简单方法。

QEMU在多大程度上模拟了Raspberry Pi,这部分可以从以下几个方面推断出来:如何用QEMU模拟Raspberry Pi Raspbian?,因为即使是Linux终端也会出现,很可能你的裸金属设备也能工作。

奖金

下面是一个好奇者的x86示例:如何在没有操作系统的情况下运行程序?

票数 27
EN

Stack Overflow用户

发布于 2015-04-23 19:00:36

虽然在Pi上裸金属是可能的,但我会避免它,因为Linux变得如此轻量级,并且为您处理了大量的东西。

如果您还想学习裸金属材料,这里有一个教程可以让您开始学习:http://www.valvers.com/open-software/raspberry-pi/step01-bare-metal-programming-in-cpt1/

尽管如此,我还是会加载您最喜欢的嵌入式linux发行版(根据您的需求,RT修补可能是首选的),并称其为好版本。

票数 21
EN

Stack Overflow用户

发布于 2015-04-23 19:17:09

https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/是一个很好的教程,他们会告诉您,在裸金属上运行代码的最好方法是劫持linux发行版,要做到这一点,只需编译到kernel.img (有适当的体系结构选项),并使用它来替换linux发行版中现有的版本,这部分教程就是:https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ok01.html#pitime

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29837892

复制
相关文章
Python安装和使用
点击 Customize installation进入一步(方便我们自定义安装路径)
Python知识大全
2020/02/12
6120
Python无法安装PyAudio
直接使用pip install pyaudio无法安装,需要先下载PyAudio-0.2.11-cp38-cp38-win_amd64.whl(Python3.8)
Marigold
2022/06/17
2.3K0
python MySQLdb安装和使用
MySQLdb是Python连接MySQL的模块,下面介绍一下源码方式安装MySQLdb:
py3study
2020/01/14
2.5K0
Python Requests库安装和使用
Python 提供了多个用来编写爬虫程序的库,除了前面已经介绍的 urllib 库之外,还有一个很重的 Requests 库,这个库的宗旨是“让 HTTP 服务于人类”。
用户10002156
2023/08/07
1K0
Python Requests库安装和使用
pandas库如何安装_python无法安装库
如果你连续看了博主的各类Python的库引用,你会发现这都是套路!!! 先上正儿八经的流程,后面一句话总结一下这些库的安装套路。不知道安装库的你们用的什么操作? 请耐心看到最后哦!保证未来的安装一举成功!
全栈程序员站长
2022/11/10
2.1K0
pandas库如何安装_python无法安装库
CentOS使用minimal安装后,无法使用SCP
当使用minimal方式装完CentOS 6.3后,发现无法使用scp,默认情况下minimal很多软件都没有安装,导致使用的时候报错。错误如下:
EltonZheng
2021/01/26
1.1K0
使用Python和Chrome安装Selenium WebDriver
WebDriver是用于与实时Web浏览器进行交互的可编程界面。它使测试自动化能够打开浏览器,发送点击,键入键,刮擦文本并最终干净地退出浏览器。WebDriver界面是W3C建议书。WebDriver标准的最受欢迎的实现是Selenium WebDriver,它是免费和开放源代码。
用户7466307
2020/07/28
3.7K0
Python基础(三):PyCharm安装和使用
PyCharm是⼀种Python IDE(集成开发环境),带有⼀整套可以帮助⽤户在使⽤Python语⾔开发时提⾼其效率的⼯具,内部集成的功能如下:
Lansonli
2022/11/30
1.4K1
Python基础(三):PyCharm安装和使用
关于CentOS下python无法安装m
说明,我CentOS的python是2.7版本 easy_install MySQL-python 提示报错说少了mysql.c等相关文件。 处理方式很简单: yum install mysql-devel 然后重新 easy_install MySQL-python 成功了
py3study
2020/01/15
1.2K0
redis的安装和使用(python篇)
最近在项目中使用到了redis来存储数据,本文总结下redis的安装和python调用。
languageX
2021/09/01
2.2K0
Python lxml库的安装和使用
lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 Xpath 表达式提供了良好的支持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。
用户10002156
2023/08/11
5980
Python lxml库的安装和使用
python3安装和使用virtuale
本文介绍了virtualenv的安装,以及使用virtualenvwrapper提高效率。本文的操作示例是在linux下完成。 一. 安装 前提: python3和pip3都已经安装。 [root@localhost]# pip3 install virtualenv virtualenvwrapper 查看virtualenvwrapper.sh的位置 [root@localhost]# which virtualenvwrapper.sh 假设输出是/usr/local/bin/virtua
py3study
2020/01/03
4150
python3 安装MySQLdb及无法
用pip安装MySQLdb 中遇到如下问题,折腾半天之久,多方尝试,终搞定,遂做此记录,以便后来者少走弯路:
py3study
2020/01/19
1.5K0
Python3 turtle安装和使用教
Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。
py3study
2020/01/03
6K0
Python:Scrapy框架的安装和基本使用
本篇文章我们来看一下强大的Python爬虫框架Scrapy。Scrapy是一个使用简单,功能强大的异步爬虫框架,我们先来看看他的安装。
一墨编程学习
2018/11/26
1.2K0
python安装依赖包经常出错怎么办_python不兼容无法安装
原来编码是None,程序肯定是采用默认的GBK,所以这里我改一下他的默认编码为:UTF-8
全栈程序员站长
2022/11/11
1.5K0
python安装依赖包经常出错怎么办_python不兼容无法安装
python 升级导致yum无法正常使用
    昨天安装django的时候有些命令用不了,一查应该是python版本过低,目前版本2.6.6,于是编译安装了2.7.2版本,编译完成后做了个软连接加到path路径里面,使python调用的2.7版本。但是问题来了,当使用yum的时候报错使用不了,找不到模块。
py3study
2020/01/15
4.1K1
Python数据分析之anaconda安装和使用
今天开始学习Python数据分析了,说到Python数据分析,大家都会推荐使用anaconda,但作为一个初学者,总是很多疑虑,但在实践中解决了一部分,先和大家分享分享。
罗罗攀
2019/02/22
1K0
Python数据分析之anaconda安装和使用
python中RabbitMQ的使用(安装和简单教程)
RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ是一个消息代理,从“生产者”接收消息并传递消息至“消费者”,期间可根据规则路由、缓存、持久化消息。“生产者”也即message发送者以下简称P,相对应的“消费者”乃message接收者以下简称C,message通过queue由P到C,queue存在于RabbitMQ,可存储尽可能多的message,多个P可向同一queue发送message,多个C可从同一个queue接收message
周小董
2019/03/25
3.8K0
python中RabbitMQ的使用(安装和简单教程)
Python爬虫:Scrapy框架的安装和基本使用
大家好,本篇文章我们来看一下强大的Python爬虫框架Scrapy。Scrapy是一个使用简单,功能强大的异步爬虫框架,我们先来看看他的安装。
QQ1622479435
2018/10/19
6540

相似问题

无法使用conda和python 3.8安装tensorflow

1218

无法使用pipenv和Python 3.8安装opencv-python

188

无法使用Python安装DuckDB

244

无法使用pip安装python

253

无法使用brew安装python

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文