Nuttx移植到S5PV210

2023-05-16

        最近没有分析飞控的代码,转而研究Nuttx实时操作系统的移植。入门一个操作的移植还是挺有难度的,首先代码的框架能理清楚就很不容易了,尤其是Nuttx这种相对小众的操作系统,参考资料比较少,中文资料更少。

        因为目的是学习Nuttx的移植,所以不想简单地用pixhawk飞控作为开发板来实验,那样的话总是会局限在现有的代码中。正好手头有块飞凌的开发板,对s5pv210这款mcu又比较熟悉了,避免了学习硬件的麻烦。

        从零开始移植到一款新的mcu难度还是挺大的,所以最好在现有的代码中找到一款跟自己使用的相似的作为参考的对象。我就选择了am335x作为依据,先分析下Nuttx的代码结构,和针对am335x需要改的代码。

      移植主要关注三个文件夹,即arch\arm\src\am335x   arch\arm\src\armv7-a 和  boards\arm\am335x\beaglebone-black三个文件夹。第一个文件夹主要负责am335x的gpio,i2c,irq等片上外设的初始化。第二个文件夹主要负责mmu和运行环境等的初始化。第三个文件夹主要就是开发板相关的初始化了,包括按钮、led、lcd等的外设的初始化。

arch\arm\src\armv7-a文件夹中的arm_head.S文件的_start函数是整个程序的入口函数。下面贴出_start函数的开始的实现:

	mov		r0, #(PSR_MODE_SVC | PSR_I_BIT | PSR_F_BIT)
	msr		cpsr_c, r0

	//关闭mmu和cache

	mrc		CP15_SCTLR(r0)
	bic		r0, r0, #(SCTLR_M | SCTLR_C)
	bic		r0, r0, #(SCTLR_I)
	mcr		CP15_SCTLR(r0)

	//清除页表

	ldr		r5, .LCppgtable			/* r5=phys. page table */
#ifndef CONFIG_ARCH_ROMPGTABLE
	mov		r0, r5
	mov		r1, #0
	add		r2, r0, #PGTABLE_SIZE
.Lpgtableclear:
	str		r1, [r0], #4
	str		r1, [r0], #4
	str		r1, [r0], #4
	str		r1, [r0], #4
	teq		r0, r2
	bne		.Lpgtableclear

#ifdef ARMV7A_PGTABLE_MAPPING
	/* If the page table does not lie in the same address space as does the
	 * mapped RAM in either case.  So we will need to create a special
	 * mapping for the page table.
	 *
	 * Load information needed to map the page table.  After the ldmia, we
	 * will have
	 *
	 *   R1 = The aligned, physical base address of the page table
	 *   R2 = The aligned, virtual base address of the page table
	 *   R3 = The MMU flags to use with the .text space mapping
	 *   R5 = The physical address of the L1 page table (from above)
	 *
	 * The value in R1 could have been obtained by simply masking R5.
	 */
    //加载LCptinfo地址
	adr		r0, .LCptinfo			/* Address of page table description */
	ldmia	r0, {r1, r2, r3}		/* Load the page table description */

	/* A single page is sufficient to map the page table */

	orr		r0, r1, r3				/* OR MMU flags into physical address */
	str		r0, [r5, r2, lsr #18]	/* Map using the virtual address as an index */
#endif

	/* Load information needed to map the .text region.  After the ldmia, we
	 * will have:
	 *
	 *   R1 = Aligned, physical address of the start of the .text region
	 *   R2 = Aligned, virtual address of the start of the .text region
	 *   R3 = MMU flags associated with the .txt region
	 *   R4 = The number of 1MB sections in the mapping
	 *   R5 = The physical address of the L1 page table (from above)
	 */






    //加载textinfo地址
	adr		r0, .LCtextinfo			/* Address of text info */
	ldmia	r0, {r1, r2, r3, r4}	/* Load the text description */

#ifndef CONFIG_IDENTITY_TEXTMAP
	/* Create identity mapping for first MB of the .text section to support
	 * this start-up logic executing out of the physical address space.  This
	 * identity mapping will be removed by .Lvstart (see below).  Of course,
	 * we would only do this if the physical-virtual mapping is not already
	 * the identity mapping.
	 */

	orr		r0, r1, r3				/* OR MMU flags into physical address */
	str		r0, [r5, r1, lsr #18]	/* Identity mapping */
#endif

	/* Map the entire .text region.  We do this before enabling caches so
	 * we know that the data will be in place in the data cache.  We map the
	 * entire text region because we don't know which parts are needed for
	 * start-up.
	 *
	 * The page table base address is in R5.  Each 32-bit page table entry
	 * maps 1 MB of address space and is indexed by the lower 20 bits of
	 * the virtual address in R2
	 */

	add		r2, r5, r2, lsr #18		/* R2=Offset page table address */

	/* Now loop until each page table entry has been written for the .text
	 * region.
	 */

.Lpgtextloop:
	orr		r0, r1, r3				/* R0: OR MMU flags into physical address */
	subs	r4, r4, #1				/* R4: Decrement the section count */
	str		r0, [r2], #4			/* Save page table entry, increment page table address */
	add		r1, r1, #(1024*1024)	/* R1: Increment the physical address */
	bne		.Lpgtextloop			/* Loop while R4 is non-zero */

#if defined(CONFIG_BOOT_RUNFROMFLASH) && !defined(CONFIG_BOOT_SDRAM_DATA)
	/* If we are executing from FLASH, then we will need additional mappings for
	 * the primary RAM region that holds the .data, .bss, stack, and heap memory.
	 *
	 *   Here we expect to have:
	 *   r5 = Address of the base of the L1 table
	 *
	 * Load information needed to map the .text region.  After the ldmia, we
	 * will have:
	 *
	 *   R1 = Aligned, physical address of the start of the .text region
	 *   R2 = Aligned, virtual address of the start of the .text region
	 *   R3 = MMU flags associated with the .txt region
	 *   R4 = The number of 1MB sections in the mapping
	 *   R5 = The physical address of the L1 page table (from above)
	 */



//加载LCraminfo地址
	adr		r0, .LCraminfo			/* Address of primary RAM info */
	ldmia	r0, {r1, r2, r3, r4}	/* Load the primary RAM description */
	add		r2, r5, r2, lsr #18		/* R2=Offset page table address */

	/* Loop until each page table entry has been written for the primary RAM
	 * region.
	 */

.Lpgramloop:
	orr		r0, r1, r3				/* R0: OR MMU flags into physical address */
	subs	r4, r4, #1				/* R4: Decrement the section count */
	str		r0, [r2], #4			/* Save page table entry, increment page table address */
	add		r1, r1, #(1024*1024)	/* R1: Increment the physical address */
	bne		.Lpgramloop				/* Loop while R4 is non-zero */

#endif /* CONFIG_BOOT_RUNFROMFLASH && !CONFIG_BOOT_SDRAM_DATA */
#endif /* CONFIG_ARCH_ROMPGTABLE */

其中的LCppgtable、LCptinfo、LCtextinfo、LCraminfo在后面都有定义,这里我整理出来

LCppgtable->待整理

LCptinfo->PGTABLE_BASE_PADDR和PGTABLE_BASE_VADDR->AM335X_OCMCO_PADDR和AM335X_0CMC0_VADDR->(AM335X_0CMC0_PSECTION+AM335X_0CMC0_OFFSET)->(0X40300000+0X00000000)

LCtextinfo->NUTTX_TEXT_PADDR和NUTTX_TEXT_VADDR->(CONFIG_RAM_START&0XFFF00000)->(0X8a000000&0xfff00000)

LCraminfo->NUTTX_RAM_PADDR和NUTTX_RAM_VADDR->

arm_head.S文件主要完成内存相关的初始化后,接着就是bl arm_data_initialize和bl arm_boot完成其它的初始化。

 

 

arch\arm\src\am335x文件夹中的内容都是跟mcu相关的,很多很细的东西,现在暂时不分析,等到移植成功后再分析。

 

boards\arm\am335x\beaglebone-black文件夹中,

       configs下lcd和nsh分别都有一个defconfig文件,该文件是在make config时的配置文件,根据选择的不同的模式会复制对应的defconfig文件到.config文件中。

       include文件夹中主要是board.h文件。该文件定义了led和button的引脚。

       scripts文件夹中有Make.defs和sdram.ld文件。由名称可知,分别是makefile文件和链接脚本文件。makefile文件就是指定编译用到的各个文件。

       sdram.ld文件中,主要的代码是

MEMORY
{
    isram (W!RX) : ORIGIN = 0x402F0400, LENGTH = 63K
    ocmc0 (W!RX) : ORIGIN = 0x40300000, LENGTH = 64K -16K
    ddr   (W!RX) : ORIGIN = 0x8a000000, LENGTH = 512M - 160M
}

这个地址的指定和上面的_start函数的地址对应上就能理解整个内存分布情况了。说明的是isram和ocmc0是am335x内部自带的内存的地址,移植的时候要注意自己采用的mcu是否有这块地址,或者对应的地址是多少。

大体的框架分析差不多了,下面就是得动手移植了。

静待佳音,我移植成功了再分享一下具体的移植过程及移植代码。

有兴趣的小伙伴可以联系我 qq:530655014

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nuttx移植到S5PV210 的相关文章

  • 【转】无人机小课堂:无人机的副翼、俯仰、偏航、油门代表什么?

    刚刚接触无人机的小伙伴 xff0c 经常会听到很多英文缩写 xff0c 如AIL ELE RUD THR等 xff0c 一不小心就会傻傻分不清 但它们却经常出现在各种遥控器 飞控 调参软件中 xff0c 因为它们是无人机 航模中最基础的四个
  • 多弹多约束协同制导问题

    参考文献 xff1a 张达 刘克新 李国飞 多约束条件下的协同制导研究进展 J 南京信息工程大学学报 自然科学版 2020 12 05 530 539 DOI 10 13878 j cnki jnuist 2020 05 002 多导弹协同
  • 浅谈设备驱动的作用与本质,有无操作系统Linux设备驱动的区别

    一 驱动的作用 任何一个计算机系统的运行都是系统中软硬件协作的结果 xff0c 没有硬件的软件是空中楼阁 xff0c 而没有软件的硬件则只是一堆废铁 硬件是底层基础 xff0c 是所有软件得以运行的平台 xff0c 代码最终会落实为硬件上的
  • 【转】多智能体系统一致性问题概述

  • 【转】从自然基金面上项目只许列10篇代表作说起

    作者 xff1a 喻海良 xff0c 字之亮 xff0c 2018年2月13日于北京沙河 关于建设 双一流大学 过程中 xff0c 我们作为大学教师该如何看待学术论文的讨论已经有很多了 个人觉得论文数量是基础 xff0c 一个大学教授的课题
  • 盘点 | 单目视觉3-D目标检测经典论文(附解读)

    2020年以来出现的一些单目视觉3 D目标检测的论文 本文针对部分典型的论文要点进行要点解读 xff0c 仅供参考 Towards Generalization Across Depth for Monocular 3D Object De
  • IBM的云平台Bluemix使用初体验-创建第一个容器

    概述 第一次使用IBM的云平台Bluemix xff0c 写一个blog记录一下 我注册Bluemix挺早的 xff0c 但是在工作中一直没有机会使用IBM的云平台 现在辞职创业 xff0c 做自己喜欢的互联网 xff0c 终于有机会用上了
  • 在Source Insight中添加对.cc的支持

    Options gt Document Options Document Type gt 下拉选择 xff1a C 43 43 Source File 在File Filter 中加入 cc
  • Android HFP流程记录

    DP 完成后 xff0c btif dm c文件中 xff0c btif dm search services evt函数 xff0c bond state changed BT STATUS SUCCESS amp bd addr BT
  • OPP文件传输

    在RFCOMM连接后 xff0c 进行Command Type Parameter Negotiation时 xff0c 会协商Credits初始值 建立OBEX连接时 xff0c 会将poll bit设置 xff0c 用于Given Cr
  • 算法——欧几里得算法

    目录 欧几里得算法算法原理欧几里得算法的代码表示 参考文献 欧几里得算法 欧几里得算法是用来求两个正整数最大公约数的算法 古希腊数学家欧几里得在其著作中 The Elements 中最早描述了这种算法 xff0c 所以叫欧几里得算法 a s
  • 算法——100瓶水,一瓶有毒,有一种试纸...

    问题描述 100瓶水 xff0c 一瓶有毒 xff0c 有一种试纸 xff0c 不过需要一个小时才能出结果 xff0c 问最少需要几片试纸才能在一小时内找到有毒的那一瓶 答案 span class token number 7 span 算
  • 基于muduo网络库的集群聊天系统(C++实现)

    文章目录 项目概述业务流程 数据模块表的设计数据库模块设计 通信格式网络和业务模块网络模块网络模块和业务模块解耦合业务模块注册业务登录业务加好友业务一对一聊天业务创建群业务加入群业务群聊业务注销业务 服务器集群跨服务器通信集群聊天服务器的思
  • linux设备驱动原理与本质

    任何计算机系统都是软件和硬件的结合体 xff0c 如果只有硬件而没有软件 xff0c 则硬件是没有灵魂的躯壳 xff1b 如果只有软件没有硬件 xff0c 则软件就是一堆无用的字符 在底层硬件的基础上 xff0c 操作系统覆盖一层驱动 xf
  • pycharm配置可视化界面流程简介

    一 安装QT Designer 在pycharm的终端里面输入如下命令 span class token comment 安装pyqt5 span pip install PyQt5 span class token comment 安装p
  • 内存——CPU、内存以及磁盘是如何交互的

    文章目录 内存的存储SRAMDRAMDRAM内部以及与内存控制模块的交互 xff08 重点 xff09 DRAM与内存存储CPU和内存的交互 xff08 重点 xff09 磁盘磁盘和CPU 内存的交互 局部性参考文献 之前在介绍linux
  • libco —— 安装与使用

    文章目录 libco的安装libco库的简单使用参考文献 libco的安装 可以直接从 Tencent 的 GitHub 仓库中拉取源码 xff1a ubuntu 64 VM 0 2 ubuntu libco span class toke
  • 为什么我的云服务器不能绑定公网 ip ?

    文章目录 云服务器的部署 xff1a 数据中心NAT协议开头问题的答案参考文献 写在前面 昨天呢 xff0c 在校招群里的小伙伴问了我们一个问题 xff0c 让我们帮给看看 xff1a 一开始呢 xff0c 博主按照经验呢跟他说是端口号被占
  • 汇编 —— 算术和逻辑操作

    文章目录 加载有效地址leaq 练习题练习题答案 一元操作符 amp 二元操作符一元 amp 二元 练习题练习题答案 移位操作移位练习题练习题答案 特殊的算数操作符练习题练习题答案 参考文献 写在前面 xff1a 从腾讯实习回来之后 xff
  • clang-format安装配置与vscode支持

    文章目录 calng format安装centos下clang format安装ubuntu下clang format的安装vscode支持clang format clang format使用参考文献 calng format安装 cen

随机推荐

  • 分布式共识算法 —— Raft详解

    文章目录 分布式共识算法顺序一致性线性一致性因果一致性 Raft 算法原理概览选举机制新节点加入leader 掉线处理多个 follower 同时掉线 日志复制 参考文献 分布式共识算法 首先我们先明确这个问题 xff1a 为什么需要分布式
  • container_of 根据成员变量获得包含其的对象的地址!

    写在前面 本系列文章的灵感出处均是各个技术书籍的读后感 xff0c 详细书籍信息见文章最后的参考文献 CONTAINER OF 在书中发现一个很有意思的宏 xff0c 以此可以衍生出来其很多的用法 xff0c 这个宏可以根据某个成员变量的地
  • Linux 内核观测技术BPF

    BPF简介 BPF xff0c 全称是Berkeley Packet Filter xff08 伯克利数据包过滤器 xff09 的缩写 其诞生于1992年 xff0c 最初的目的是提升网络包过滤工具的性能 后面 xff0c 随着这个工具重新
  • bpftrace 指南

    文章目录 0 bpftrace0 1 bpftrace组件0 2 bpftrace 帮助信息0 3 bpftrace 工具速览表0 4 bpftrace 探针0 4 1 tracepoint0 4 2 usdt0 4 3 kprobe和kr
  • make px4_sitl_default gazebo编译报错解决办法

    PX4无人机ROS下仿真 xff0c 下载Fireware后执行make px4 sitl default gazebo编译 xff0c 编译过程中出现如下错误 xff1a 错误原因是两个package没有安装 xff1a gstreame
  • 理解实时操作系统与裸机的区别

    早期嵌入式开发没有嵌入式操作系统的概念 xff0c 直接操作裸机 xff0c 在裸机上写程序 xff0c 比如用51单片机基本就没有操作系统的概念 通常把程序分为两部分 xff1a 前台系统和后台系统 简单的小系统通常是前后台系统 xff0
  • 4.1.2.HTTP报文格式解析

    不同的请求方式 xff0c 他们的请求格式可能是不一样的 xff0c 请求格式就是我们所说的的报文格式 但是 xff0c 通常来说一个HTTP请求报文由请求行 xff08 request line xff09 请求头 xff08 heade
  • apt-get autoremove 命令你敢不敢用?

    apt get autoremove 命令你敢不敢用 xff1f 用apt时看到有提示 xff0c 说有些软件包已经不再被需要 xff0c 可以使用 autoremove 命令删除 xff0c 我是一个希望保持系统简洁性的人 xff0c 当
  • 英伟达(NVIDIA)系列显卡(GPU)技术指标对比排行

    性能概览 关于N卡架构发展史详见本人前篇博客 点击打开链接 Pascal xff08 帕斯卡 xff09 架构 显卡名称cuda核心数量主频 xff08 MHz xff09 超频 xff08 MHz xff09 存储速度显存配置位宽带宽 G
  • Cmake gcc make makefile 区别以及联系

    作者 xff1a 辉常哥 链接 xff1a https www zhihu com question 27455963 answer 89770919 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业
  • 使用Docker构建一个Git镜像,用来clone仓库

    概述 使用docker已经有一年多了 xff0c 最近意识到 xff0c 我在快速编排服务的时候 xff0c shell脚本里用到的git还是原生的 于是打算也将git容器化 xff0c 在dockerhub上搜罗了一筐 xff0c 找到这
  • make -C M选项

    modules MAKE C KERNELDIR M 61 PWD modules 这句是Makefile的规则 xff1a 这里的 MAKE 就相当于make xff0c C 选项的作用是指将当前工作目录转移到你所指定的位置 M 61 选
  • 什么是耦合、解耦

    一 耦合 1 耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象 2 在软件工程中 xff0c 对象之间的耦合度就是对象之间的依赖性 对象之间的耦合越高 xff0c 维护成本越高 xff0c 因此对象的设计
  • ERROR! Session/line number was not unique in database. History logging moved to new session 178

    原来的代码 xff1a MODEL NAME 61 39 ssd mobilenet v1 coco 2017 11 17 39 载入训练好的pb模型 detection graph 61 tf Graph with detection g
  • 基于px4的hc-sr04-pwm超声波模块的驱动开发

    一直想实现无人的避障功能 xff0c 但是px4源生代码又不支持避障 xff0c 所以只能自己动手写 避障的基础条件还是获取距离数据 xff0c 超声波模块就是最熟悉也是最简单的模块了 px4源生代码也支持了几种超声波模块 xff0c 但是
  • px4最新版commander代码分析

    commander位于Firmware src modules commander文件夹中 该部分主要负责对地面站 遥控器以及其它部分发布的cmd命令 xff0c 包括vehicle command VEHICLE CMD DO SET M
  • SMPL模型进阶

    SMPL模型是一种参数化人体模型 xff0c 是马普所提出的一种人体建模方法 xff0c 该方法可以进行任意的人体建模和动画驱动 这种方法与传统的LBS的最大的不同在于其提出的人体姿态影像体表形貌的方法 xff0c 这种方法可以模拟人的肌肉
  • px4最新版navigation代码分析

    navigation部分位于代码Firmware navigator文件夹中 其中不仅仅包含navigator的代码 xff0c 最主要的9种不同的飞行模式的代码 xff0c 它们针对不同的飞行模式计算出不同的期望的位置 xff0c 即po
  • 基于最新版本px4的takeoff代码分析

    takeoff是px4的一种飞行模式 xff0c 跟之前分析的lotier部分是一种类型 takeoff模式也是由navigator部分进行调用的 xff0c 所以也就印证了上一篇说navigator相当于一个分发器的说法 各种飞行模式实际
  • Nuttx移植到S5PV210

    最近没有分析飞控的代码 xff0c 转而研究Nuttx实时操作系统的移植 入门一个操作的移植还是挺有难度的 xff0c 首先代码的框架能理清楚就很不容易了 xff0c 尤其是Nuttx这种相对小众的操作系统 xff0c 参考资料比较少 xf