精华内容
下载资源
问答
  • nuttx
    2020-11-03 20:43:54

    ubuntu14.04 nuttx开发环境的搭建

    1. 在ubuntu根目录下:xxx@ubuntu: sudo apt-get update
    2. 下载编译:sudo apt-get install gcc-arm-none-eabi
    3. 下载kconfig-frontends文件,将下载下来的包解压到:mnt/nx/misc,再将文件后边的版本号去掉,即将文件夹重命名为:kconfig-frontends。
      下载地址:https://bitbucket.org/nuttx/tools/downloads/
    4. 下载依赖包 xxx@ubuntu: sudo apt-get install gperf libncurses5-dev flex bison
    5. 进入cd:mnt/nx/misc/kconfig-frontends/这个文件夹下(注意3。步骤的文件)
    6. 设置config: 在mnt/nx/misc/kconfig-frontends/这个文件夹下
      执行:./configure --prefix=/usr
    7. 在mnt/nx/misc/kconfig-frontends/ 目录下:执行 :make
    8. 在mnt/nx/misc/kconfig-frontends/ 目录下:执行 :sudo make install
    9. 载Nuttx源码:http://sourceforge.net/projects/nuttx/files/nuttx/下载两个压缩包:nuttx-7.15.tar.gz 和apps-7.15.tar.gz.
      讲压缩包 解压到/mnt/nx下,去掉版本号,即文件夹重新命名为:
      nuttx 和 apps
    10. 进入:cd /mnt/nx/nuttx/tools
    11. /mnt/nx/nuttx/tools目录:./configure.sh stm32_tiny/nsh
    12. cd /mnt/nx/nuttx/:sudo make menuconfig
    13. 选择Build Setup,进入后选择Build Host platform,将其改成LINUX
    14. 选择System Type,进入后选择ARM chip selection (STMicro STM32 F1/F2/F3/F4) , STM32 Chip Selection (STM32F103VE)芯片选型,以及Toolchain Selection(Generic GNU EABI toochain under linux(or other POSIX environment)
    15. 选择Board Selection,进入后选择目标板Select target board (M3 Wildfire STM32 board)
    16. 选择Application Configuration–>example–>hello 应用程序(打印hello world)
    17. 保存后退出,在 /mnt/nx/nuttx/目录: cp /usr/lib/libkconfig-parser-4.11.0.so lib(注意:最好在 /usr/lib/libkconfig-parser-4.11.0.so 看看能不能找到)
    18. 复制完:执行 :source setenv.sh
    19. 最后make: make
    20. 检查make执行有何报错
    更多相关内容
  • NuttX构建使用的默认应用程序目录应命名为apps/ (或apps-xyz/ ,其中xyz是NuttX版本号)。 这个apps/目录应该出现在目录树中与NuttX目录相同的级别。 喜欢: . |- nuttx | `- apps 如果以上所有条件都为TRUE,...
  • APACHE NUTTX(吸引人) 介绍孵化状态社区获得帮助邮件列表问题追踪器源代码网站源代码环境环境安装Cygwin Windows 10下的Ubuntu Bash 使用macOS 安装下载并解压缩半可选的应用程序/程序包路径中有空格的安装目录从...
  • nuttx移植软件包

    2018-06-01 10:01:25
    nuttx实时操作系统的移植所需要的必要软件,iso请自行下载。
  • nuttx中断处理.vsdx

    2020-12-09 10:58:29
    由于nuttx中切换到svc模式处理中断,且使用的栈也在svc模式,所以需要恢复2个现场, a. svc中断处理前后的现场(因为切换到svc模式处理中断,这是问题的根源) b. 中断发生前模式现场的恢复 此处借助恢复中断发生前...
  • 内部包括nuttx和app,适用于SAMV71-Xplained开发板,直接编译make,然后可烧录到开发板上即可,使用usart1作为调试口
  • 非常简单的配置Nuttx空间和使用为esp32-devkitc创建nuttxspace并配置操作系统nuttx 带有MCU ESP32的RTOS NUTTX(Nodemcu) 一些选项:为ESP32创建RTOS Nuttx空间;为ESP32创建RTOS Nuttx空间。 删除Nuttx空间; 更新...
  • Nuttx是实时嵌入式操作系统(RTOS)。 其目标是:(1)可在深度嵌入式,资源受限的环境中使用的小尺寸存储空间;(2)从微型(8位)到中等(32位)的完全可扩展性;(3)符合标准;(4)实时; (5)完全开放。 想想...
  • nuttx-README.pdf

    2019-11-06 22:57:38
    nuttx官方文档的注释版,里面有我自己个人的一些心得体会,也很可能有错误,希望大家积极反馈,同时有什么发现也可以发消息给我。
  • ubuntu_sim_nuttx.sh

    2021-10-14 14:27:05
    px4环境搭建无法下载的脚本,已经下载好,供参考
  • 该RISC-V模拟器支持Linux,xv6,NuttX,FreeRTOS和Zephyr OS。用法 $ ../target/release/riscv_emu_desktop [options]Options: -k, --kernel Kernel image file -f, --filesystem File system image file -d, --dtb...
  • nuttx_20190321.tar.gz

    2019-07-09 19:34:06
    nuttx 飞控嵌入式操作系统 linux下的整个工程 包含所有的源代码 资料很全 可以移植到stm32f4上面 我是从freertos转移过来的 这个操作系统资料比较少 需要好好研究一下源代码才能够了解架构 如果没有基础就不要下载了
  • nuttx-7.6 a very important realtime operating system
  • Nuttx文件系统

    千次阅读 2021-05-16 07:50:46
    1. 介绍文件系统,是对一个存储设备上的数据和元数据进行组织的机制,它是操作系统管理持久性数据的子系统,提供数据存储和访问...1.1 Nuttx文件系统介绍Nuttx包含了一个可选的、可扩展的文件系统,这个文件系统可...

    1. 介绍

    文件系统,是对一个存储设备上的数据和元数据进行组织的机制,它是操作系统管理持久性数据的子系统,提供数据存储和访问功能。

    将一个文件系统与一个存储设备关联起来的过程叫做挂载(mount),挂载时会将一个文件系统附着到当前文件系统层次结构中(根),在执行挂载时,需要提供文件系统类型、文件系统和一个挂载点。1.1 Nuttx文件系统介绍

    Nuttx包含了一个可选的、可扩展的文件系统,这个文件系统可以完全省略掉,Nuttx不依赖于任何文件系统的存在。伪根文件系统

    可以通过将CONFIG_NFILE_DESCRIPTOS设置成非零值,来使能这个内存中的伪文件系统。它是一个内存文件系统,因为它不需要任何存储介质或块驱动程序的支持。文件系统内容是通过标准文件系统操作(open, close, read, write, etc.)实时生成的。在这个意义上,它是一个伪文件系统(Linux的/proc也称为伪文件系统)。

    可以通过伪文件系统访问用户提供的任何数据或逻辑。支持对字符设备驱动及块设备驱动节点在伪文件系统任何目录中的内建,不过按照惯例,都习惯放在/dev伪文件系统目录中。

    文件系统挂载

    简单的内存文件系统,可通过挂载块设备来扩展,这些块设备提供大容量存储设备支持以实现真正的文件系统访问。Nuttx支持标准的mount()命令,该命令允许块驱动程序将文件系统绑定到伪文件系统中的挂载点上。目前,Nuttx支持VFAT文件系统。

    与Linux比较

    从编程的角度来看,Nuttx文件系统看起来与Linux文件系统非常类似,但是,有一个根本的区别:Nuttx根文件系统是一个伪文件系统,而真正的文件系统可以挂载在伪文件系统中;相比之下,在典型的Linux安装中,Linux根文件系统是一个真正的文件系统,伪文件系统挂载在真正的根文件系统中。Nuttx选择的方法,旨在提供从非常小的平台到中等平台等的支持,以便具备更好的可扩展性。

    2. 数据结构2.1 struct inode

    inode是文件系统中最重要的结构,存放基本的数据:struct inode{

    FAR struct inode *i_peer;     /* Link to same level inode */

    FAR struct inode *i_child;    /* Link to lower level inode */

    int16_t           i_crefs;    /* References to inode */

    uint16_t          i_flags;    /* Flags for inode */

    union inode_ops_u u;          /* Inode operations */#ifdef CONFIG_FILE_MODE

    mode_t            i_mode;     /* Access mode flags */#endif

    FAR void         *i_private;  /* Per inode driver private data */

    char              i_name[1];  /* Name of inode (variable) */};i_peer和i_child会将inode组织成树状结构;

    i_flags用于表明文件类型,比如Character driver/Block driver/Mount point/Special OS type/Named semaphore/Message Queue/Shared memory region/Soft link等

    i_private在驱动中,通常用于存放私有数据;

    union inode_ops_u u,存放对inode的操作函数集,而针对不同的inode类型,对应不同的操作函数;2.2 union inode_ops_uunion inode_ops_u

    {

    FAR const struct file_operations     *i_ops;    /* Driver operations for inode */#ifndef CONFIG_DISABLE_MOUNTPOINT

    FAR const struct block_operations    *i_bops;   /* Block driver operations */

    FAR const struct mountpt_operations  *i_mops;   /* Operations on a mountpoint */#endif#ifdef CONFIG_FS_NAMED_SEMAPHORES

    FAR struct nsem_inode_s              *i_nsem;   /* Named semaphore */#endif#ifndef CONFIG_DISABLE_MQUEUE

    FAR struct mqueue_inode_s            *i_mqueue; /* POSIX message queue */#endif#ifdef CONFIG_PSEUDOFS_SOFTLINKS

    FAR char                             *i_link;   /* Full path to link target */#endif};

    主要有三个操作函数集,此外由于VFS也维护了像Named semaphores/Message Queues/Shared memory等资源,但是这些资源又不像其他类型的文件有函数操作集,算是special case,也放在这个结构中。struct file_operations,存放对驱动的操作,一般在实现驱动程序中,都会去实现对应的函数操作;struct file_operations{

    /* The device driver open method differs from the mountpoint open method */

    int     (*open)(FAR struct file *filep);  /* The following methods must be identical in signature and position because

    * the struct file_operations and struct mountp_operations are treated like

    * unions.

    */

    int     (*close)(FAR struct file *filep);  ssize_t (*read)(FAR struct file *filep, FAR char *buffer, size_t buflen);  ssize_t (*write)(FAR struct file *filep, FAR const char *buffer, size_t buflen);  off_t   (*seek)(FAR struct file *filep, off_t offset, int whence);  int     (*ioctl)(FAR struct file *filep, int cmd, unsigned long arg);  /* The two structures need not be common after this point */#ifndef CONFIG_DISABLE_POLL

    int     (*poll)(FAR struct file *filep, struct pollfd *fds, bool setup);#endif#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS

    int     (*unlink)(FAR struct inode *inode);#endif};struct block_operations,存放块设备的操作函数集,用于文件系统转换;struct block_operations

    {  int     (*open)(FAR struct inode *inode);  int     (*close)(FAR struct inode *inode);

    ssize_t (*read)(FAR struct inode *inode, FAR unsigned char *buffer,

    size_t start_sector, unsigned int nsectors);

    ssize_t (*write)(FAR struct inode *inode, FAR const unsigned char *buffer,

    size_t start_sector, unsigned int nsectors);  int     (*geometry)(FAR struct inode *inode, FAR struct geometry *geometry);  int     (*ioctl)(FAR struct inode *inode, int cmd, unsigned long arg);#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS

    int     (*unlink)(FAR struct inode *inode);#endif};struct mountpt_operations,由一个文件系统提供,用于描述挂载点;struct inode;struct fs_dirent_s;struct stat;struct statfs;struct mountpt_operations

    {  /* The mountpoint open method differs from the driver open method

    * because it receives (1) the inode that contains the mountpoint

    * private data, (2) the relative path into the mountpoint, and (3)

    * information to manage privileges.

    */

    int     (*open)(FAR struct file *filep, FAR const char *relpath,            int oflags, mode_t mode);  /* The following methods must be identical in signature and position

    * because the struct file_operations and struct mountp_operations are

    * treated like unions.

    */

    int     (*close)(FAR struct file *filep);

    ssize_t (*read)(FAR struct file *filep, FAR char *buffer, size_t buflen);

    ssize_t (*write)(FAR struct file *filep, FAR const char *buffer,

    size_t buflen);

    off_t   (*seek)(FAR struct file *filep, off_t offset, int whence);  int     (*ioctl)(FAR struct file *filep, int cmd, unsigned long arg);  /* The two structures need not be common after this point. The following

    * are extended methods needed to deal with the unique needs of mounted

    * file systems.

    *

    * Additional open-file-specific mountpoint operations:

    */

    int     (*sync)(FAR struct file *filep);  int     (*dup)(FAR const struct file *oldp, FAR struct file *newp);  int     (*fstat)(FAR const struct file *filep, FAR struct stat *buf);  /* Directory operations */

    int     (*opendir)(FAR struct inode *mountpt, FAR const char *relpath,

    FAR struct fs_dirent_s *dir);  int     (*closedir)(FAR struct inode *mountpt,

    FAR struct fs_dirent_s *dir);  int     (*readdir)(FAR struct inode *mountpt,

    FAR struct fs_dirent_s *dir);  int     (*rewinddir)(FAR struct inode *mountpt,

    FAR struct fs_dirent_s *dir);  /* General volume-related mountpoint operations: */

    int     (*bind)(FAR struct inode *blkdriver, FAR const void *data,

    FAR void **handle);  int     (*unbind)(FAR void *handle, FAR struct inode **blkdriver,            unsigned int flags);  int     (*statfs)(FAR struct inode *mountpt, FAR struct statfs *buf);  /* Operations on paths */

    int     (*unlink)(FAR struct inode *mountpt, FAR const char *relpath);  int     (*mkdir)(FAR struct inode *mountpt, FAR const char *relpath,

    mode_t mode);  int     (*rmdir)(FAR struct inode *mountpt, FAR const char *relpath);  int     (*rename)(FAR struct inode *mountpt, FAR const char *oldrelpath,

    FAR const char *newrelpath);  int     (*stat)(FAR struct inode *mountpt, FAR const char *relpath,

    FAR struct stat *buf);  /* NOTE:  More operations will be needed here to support:  disk usage

    * stats file stat(), file attributes, file truncation, etc.

    */};2.3 struct file一个打开的文件对应一个struct file结构,在该结构中包含了inode,用于描述文件的类型以及对应的函数操作集。struct file{

    int               f_oflags;   /* Open mode flags */

    off_t             f_pos;      /* File position */

    FAR struct inode *f_inode;    /* Driver or file system interface */

    void             *f_priv;     /* Per file driver private data */};在每个进程中,struct tcb_s结构中都有一个struct filelist结构,用于维护打开的文件,当一个进程调用POSIX接口open来打开时,会得到文件描述符,文件描述符对应的就是这个文件数组的索引值。struct filelist{

    sem_t   fl_sem;               /* Manage access to the file list */

    struct file fl_files[CONFIG_NFILE_DESCRIPTORS];}

    3. 原理分析3.1 框架分析

    架构框图如下所示:

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    文件系统框图用户层,通过系统调用调到VFS层的通用接口;

    VFS层,相当于一个适配层,用于对接不同的实际文件系统;

    实际文件系统层,典型的情况下一个文件系统都需要绑定到块设备驱动程序上,而一些不太典型的情况是不需要块设备驱动,比如伪文件系统(BINFS、PROCFS)和MTD文件系统(NXFFS)。在Nuttx中,需要块设备驱动的文件系统为:FAT、ROMFS、SMARTFS;而不需要块设备驱动的文件系统为:NXFFS、BINFS、PROCFS、NFS、TMPFS等;

    MTD,Memory Technology Devices,向上提供MTD接口,向下对接不同的硬件设备;3.2 mount流程

    mount()函数用于将source块设备指定的文件系统与根文件系统中target指定的路径名关联在一起。

    在讲mount()之前,需要先了解一下数据结构:struct fsmap_tstruct fsmap_t{

    FAR const char                      *fs_filesystemtype;

    FAR const struct mountpt_operations *fs_mops;};

    这个结构完成的就是文件系统名字和对应的操作函数集的映射,在mount()函数中会根据对应的文件系统名字去查找struct mountpt_operations。struct mountpt_operations

    这个数据结构在上文中介绍过了,有一个函数需要特别注意一下:int     (*bind)(FAR struct inode *blkdriver, FAR const void *data, FAR void **handle);

    该函数用于将文件系统与某个块设备驱动进行绑定。

    mount()关键代码如下:int mount(FAR const char *source, FAR const char *target,

    FAR const char *filesystemtype, unsigned long mountflags,

    FAR const void *data){#if defined(BDFS_SUPPORT) || defined(NONBDFS_SUPPORT)#ifdef BDFS_SUPPORT

    FAR struct inode *blkdrvr_inode = NULL;#endif

    FAR struct inode *mountpt_inode;

    FAR const struct mountpt_operations *mops;#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS

    struct inode_search_s desc;#endif

    void *fshandle;  int errcode;  int ret;  /* Verify required pointer arguments */

    DEBUGASSERT(target && filesystemtype);  /* Find the specified filesystem.  Try the block driver file systems first */#ifdef BDFS_SUPPORT

    if (source && (mops = mount_findfs(g_bdfsmap, filesystemtype)) != NULL)

    {      /* Make sure that a block driver argument was provided */

    DEBUGASSERT(source);      /* Find the block driver */

    ret = find_blockdriver(source, mountflags, &blkdrvr_inode);      if (ret 

    {

    ferr("ERROR: Failed to find block driver %s\n", source);

    errcode = -ret;          goto errout;

    }

    }  else#endif /* BDFS_SUPPORT */#ifdef NONBDFS_SUPPORT  if ((mops = mount_findfs(g_nonbdfsmap, filesystemtype)) != NULL)

    {

    }  else#endif /* NONBDFS_SUPPORT */

    {

    ferr("ERROR: Failed to find file system %s\n", filesystemtype);

    errcode = ENODEV;      goto errout;

    }

    inode_semtake();#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS

    /* Check if the inode already exists */

    SETUP_SEARCH(&desc, target, false);

    ret = inode_find(&desc);  if (ret >= 0)

    {      /* Successfully found.  The reference count on the inode has been

    * incremented.

    */

    mountpt_inode = desc.node;

    DEBUGASSERT(mountpt_inode != NULL);      /* But is it a directory node (i.e., not a driver or other special

    * node)?

    */

    if (INODE_IS_SPECIAL(mountpt_inode))

    {

    ferr("ERROR: target %s exists and is a special node\n", target);

    errcode = -ENOTDIR;

    inode_release(mountpt_inode);          goto errout_with_semaphore;

    }

    }  else#endif  /* Insert a dummy node -- we need to hold the inode semaphore

    * to do this because we will have a momentarily bad structure.

    * NOTE that the new inode will be created with an initial reference

    * count of zero.

    */

    {

    ret = inode_reserve(target, &mountpt_inode);      if (ret 

    {          /* inode_reserve can fail for a couple of reasons, but the most likely

    * one is that the inode already exists. inode_reserve may return:

    *

    *  -EINVAL - 'path' is invalid for this operation

    *  -EEXIST - An inode already exists at 'path'

    *  -ENOMEM - Failed to allocate in-memory resources for the operation

    */

    ferr("ERROR: Failed to reserve inode for target %s\n", target);

    errcode = -ret;          goto errout_with_semaphore;

    }

    }  /* Bind the block driver to an instance of the file system.  The file

    * system returns a reference to some opaque, fs-dependent structure

    * that encapsulates this binding.

    */

    if (!mops->bind)

    {      /* The filesystem does not support the bind operation ??? */

    ferr("ERROR: Filesystem does not support bind\n");

    errcode = EINVAL;      goto errout_with_mountpt;

    }  /* Increment reference count for the reference we pass to the file system */#ifdef BDFS_SUPPORT#ifdef NONBDFS_SUPPORT

    if (blkdrvr_inode)#endif

    {

    blkdrvr_inode->i_crefs++;

    }#endif

    /* On failure, the bind method returns -errorcode */#ifdef BDFS_SUPPORT

    ret = mops->bind(blkdrvr_inode, data, &fshandle);#else

    ret = mops->bind(NULL, data, &fshandle);#endif

    if (ret != 0)

    {      /* The inode is unhappy with the blkdrvr for some reason.  Back out

    * the count for the reference we failed to pass and exit with an

    * error.

    */

    ferr("ERROR: Bind method failed: %d\n", ret);#ifdef BDFS_SUPPORT#ifdef NONBDFS_SUPPORT

    if (blkdrvr_inode)#endif

    {

    blkdrvr_inode->i_crefs--;

    }#endif

    errcode = -ret;      goto errout_with_mountpt;

    }  /* We have it, now populate it with driver specific information. */

    INODE_SET_MOUNTPT(mountpt_inode);

    mountpt_inode->u.i_mops  = mops;#ifdef CONFIG_FILE_MODE

    mountpt_inode->i_mode    = mode;#endif

    mountpt_inode->i_private = fshandle;

    inode_semgive();  /* We can release our reference to the blkdrver_inode, if the filesystem

    * wants to retain the blockdriver inode (which it should), then it must

    * have called inode_addref().  There is one reference on mountpt_inode

    * that will persist until umount2() is called.

    */...

    }

    完成的工作主要有:调用mount_findfs()函数,根据传入的参数filesystemtype来找到对应的文件系统操作函数集mops,如果是需要块设备支持的文件系统,则需要调用find_blockdriver()来查找传入参数source对应的块设备驱动;

    根据传入参数target,来查找需要mount的路径对应的inode节点,如果没有的话需要调用inode_reserve()创建一个mountpt_inode;

    调用mops->bind()函数将文件系统与块设备驱动进行绑定,如果不需要块设备支持的文件系统,bind()函数可能不需要做特殊处理, 而在需要块设备支持的文件系统中,bind()函数最终会将该文件系统的整体状态都传出来,保存在fshandle中;

    更新挂载点mountpt_inode的内容,包括操作函数集mops,以及将fshandle保存的文件系统的整体状态放置到mountpt_inode结构中的i_private字段中。当打开这个挂载点mountpt_inode时,便可以根据这个字段来取出对应的信息。

    作者:Loyen

    链接:https://www.jianshu.com/p/887cffbc3e7d

    展开全文
  • 嵌入式操作系统介绍之 NuttX

    千次阅读 2021-07-27 08:07:19
    1 NuttX 实时操作系统 2 关键特征 3 支持的平台 4 支持的板卡 5 文件系统 6 设备驱动 7 C/C++ 库 8 网络 9 Flash 支持 10 USB 支持 11 图形支持 12 插件 13 开发环境 14 链接 1 NuttX 实时操作...

    更好的排版:https://mp.weixin.qq.com/s/W5-PhZmL8aZpT4nKy14_HQ

    目录

    1  NuttX 实时操作系统

    2  关键特征

    3  支持的平台

    4  支持的板卡

    5  文件系统

    6  设备驱动

    7  C/C++ 库

    8  网络

    9  Flash 支持

    10  USB 支持

    11  图形支持

    12  插件

    13  开发环境

    14  链接


    048: Overview about NuttX Drivers - YouTube

    1  NuttX 实时操作系统

    NuttX 是一个实时操作系统(RTOS),强调标准兼容和小型封装,具有从8位到32位微控制器环境的高度可扩展性。NuttX 主要遵循  Posix 和 ANSI 标准,对于在这些标准下不支持的功能,或者不适用于深度嵌入环境的功能(如 fork()),采用来自 Unix 和常见 RTOS (如 VxWorks)的额外的标准 API。

    NuttX 的第一个版本由 Gregory Nutt 于 2007 年在宽松的 BSD 许可证下发布。

    2  关键特征

    标准兼容
    核心任务管理
    模块化设计
    完全可抢占
    天然可扩展
    高度可配置
    图形化配置工具
    容易扩展到新的处理器架构、 SoC 架构或板级架构
    FIFO 和轮转调度
    实时的、确定性的、支持优先级继承
    类 POSIX/ANSI 的任务控制、命名消息队列、计数信号量、时钟/定时器、信号、pthread、环境变量、文件系统
    类VxWorks的任务管理和看门狗定时器
    BSD 套接字接口
    优先级管理的扩展
    可选的具有地址环境的任务(进程)
    可继承的“控制终端”和 I/O 重定向
    请求式分页
    系统日志
    可以构建为开放的、平面的嵌入式 RTOS,或单独构建为具有系统调用接口的微内核
    内建每线程 CPU 负载测量
    良好的文档支持

    3  支持的平台

    3.1  Allwinner
    A10 (Cortex-A8)
    3.2  Atmel
    AVR ATMega128 (8-bit AVR)
    AVR AT90USB64x and AT90USB6128x (8-bit AVR)
    AVR32 AT32UC3BXXX (32-bit AVR32)
    Atmel SAMD20 (ARM Cortex-M0+)
    Atmel SAM3U (ARM Cortex-M3)
    Atmel SAM3X (ARM Cortex-M3)
    Atmel SAM4L (ARM Cortex-M4)
    Atmel SAM4S (ARM Cortex-M4)
    Atmel SAM4E (ARM Cortex-M4)
    Atmel SAMA5D3 (ARM Cortex-A5)
    3.3  Freescale
    M68HCS12
    Freescale i.MX1 (ARM920-T)
    FreeScale KL25Z (ARM Cortex-M0+)
    FreeScale Kinetis K40 (ARM Cortex-M4)
    FreeScale Kinetis K60 (ARM Cortex-M4)
    3.4  基于主机 PC 的仿真
    Linux/Cygwin 用户模式仿真
    3.5  Intel
    Intel 80x52
    Intel 80x86
    3.6  MicroChip
    PIC32MX2xx Family (Modified MIPS32)
    PIC32MX4xx Family (Modified MIPS32)
    PIC32MX7xx Family (Modified MIPS32)
    3.7  nuvoTon
    nuvoTon NUC120 (ARM Cortex-M0)
    3.8  NXP
    NXP LPC214x (ARM7TDMI)
    NXP LPC2378 (ARM7TDMI)
    NXP LPC3131 (ARM9E6JS)
    NXP LPC315x (ARM9E6JS)
    NXP LPC176x (ARM Cortex-M3)
    NXP LPC178x (ARM Cortex-M3)
    NXP LPC43xx (ARM Cortex-M4)
    3.9  Renesas/Hitachi:
    Renesas/Hitachi SuperH
    Renesas M16C/26
    3.10  STMicroelectronics
    STMicro STR71x (ARM7TDMI)
    STMicro STM32L152 (STM32 L "EnergyLite" Line, ARM Cortex-M3)
    STMicro STM32F100x (STM32 F1 "Value Line"Family, ARM Cortex-M3)
    STMicro STM32F103C4/C8 (STM32 F1 "Low- and Medium-Density Line" Family, ARM Cortex-M3)
    STMicro STM32F103x (STM32 F1 Family, ARM Cortex-M3)
    STMicro STM32F107x (STM32 F1 "Connectivity Line" family, ARM Cortex-M3)
    STMicro STM32F207x (STM32 F2 family, ARM Cortex-M3)
    STMicro STM32F303x (STM32 F3 family, ARM Cortex-M4).
    STMicro STM32F407x (STM32 F4 family, ARM Cortex-M4)
    STMicro STM32 F427/437 (STM32 F4 family, ARM Cortex-M4)
    STMicro STM32 F429 (STM32 F4 family, ARM Cortex-M4)
    3.11  Texas Instruments (some formerly Luminary)
    TI TMS320-C5471 (ARM7TDMI)
    TI Calypso (ARM7TDMI)
    TI TMS320-DM320 (ARM9E6JS)
    TI/Stellaris LM3S6432 (ARM Cortex-M3)
    TI/Stellaris LM3S6432S2E (ARM Cortex-M3)
    TI/Stellaris LM3S6918 (ARM Cortex-M3)
    TI/Stellaris LM3S6965 (ARM Cortex-M3)
    TI/Stellaris LM3S8962 (ARM Cortex-M3)
    TI/Stellaris LM3S9B96 (ARM Cortex-M3)
    TI/Stellaris LM4F120x (ARM Cortex-M4)
    TI/Tiva TM4C123G (ARM Cortex-M4)
    3.12  ZiLOG
    ZiLOG ZNEO Z16F
    ZiLOG eZ80 Acclaim!
    ZiLOG Z8Encore!
    ZiLOG Z180
    ZiLOG Z80

    4  支持的板卡

    16z
    amber
    arduino-due
    avr32dev1
    c5471evm
    cloudctrl
    compal_e86
    compal_e88
    compal_e99
    demo9s12ne64
    ea3131
    ea3152
    eagle100
    ekk-lm3s9b96
    ez80f910200kitg
    ez80f910200zco
    fire-stm32v2
    freedom-kl25z
    hymini-stm32v
    kwikstik-k40
    lincoln60
    lm3s6432-s2e
    lm3s6965-ek    lm3s8962-ek
    lm4f120-launchpad
    lpc4330-xplorer
    lpcxpresso-lpc1768
    maple
    mbed
    mcu123-lpc214x
    micropendous3
    mikroe-stm32f4
    mirtoo
    mx1ads
    ne64badge
    ntosd-dm320
    nucleus2g
    nutiny-nuc120
    olimex-lpc1766stk
    olimex-lpc2378
    olimex-lpc-h3131
    olimex-stm32-p107
    olimex-stm32-p207
    olimex-strp711
    open1788
    p112    pcblogic-pic32mx
    pcduino-a10
    pic32mx7mmb
    pic32-starterkit
    pirelli_dpl10
    pjrc-8051
    px4fmu-v2_upstream
    qemu-i486
    rgmp
    sam3u-ek
    sam4e-ek
    sam4l-xplained
    sam4s-xplained
    sama5d3x-ek
    samd20-xplained
    神舟IV号
    sim
    skp16c26
    spark
    stm3210e-eval
    stm3220g-eval
    stm3240g-eval
    stm32f100rc_generic    stm32f3discovery
    stm32f429i-disco
    stm32f4discovery
    stm32ldiscovery
    stm32_tiny
    stm32vldiscovery
    sure-pic32mx
    teensy
    tm4c123g-launchpad
    twr-k60n512
    ubw32
    us7032evb1
    viewtool-stm32f107
    vsn
    xtrs
    z16f2800100zcog
    z80sim
    z8encore000zco
    z8f64200100kit
    zkit-arm-1769
    zp214xpa
     

    5  文件系统

    基于内存的微型根伪文件系统
    虚拟文件系统(VFS)
    可挂载的卷:绑定挂载点、文件系统和块设备驱动器。
    通用系统日志(SYSLOG)支持
    FAT12/16/32文件系统支持
    NFS客户端:客户端侧支持网络文件系统(NFS,版本3,UDP)
    NXFFS:微型 NuttX 损耗平衡 FLASH 文件系统
    SMART:Ken Pettit提供的 FLASH文件系统。
    procfs/ 文件系统
    基于 SPI 的 MMC/SD/SDH 卡的通用驱动
    ROMFS文件系统支持
    二进制加载器支持下列格式:
    脱离链接的 ELF 模块
    脱离链接的 NXFLAT 模块。NXFLAT 是可以从文件系统芯片内执行的二进制格式。
    PATH 变量支持
    通过 TFTP 和 FTP、HTML (wget)、 Zmodem (sz 和 rz) 传输文件(接收和发送)。

    6  设备驱动

    VFS 支持字符和块驱动
    网络、 USB (主机)、 USB (设备)、 串口、 I2C、 I2S、 NAND、 CAN、 ADC、 DAC、 PWM、 正交编码器和看门狗定时器驱动架构。
    RAMDISK、 管道、 FIFO、 /dev/null、 /dev/zero 驱动
    基于 SPI 或 SDIO 的 MMC/SD/SDH 卡的通用驱动
    电源管理子系统
    内建 FreeModBus 1.5.0 版提供的 ModBus 支持
    图形设备:帧缓冲驱动、图形和段式 LCD 驱动
    音频子系统:编解码器、音频输入和输出驱动。命令行和图形界面媒体播放器应用程序
    输入设备:触摸屏、USB 键盘、USB鼠标、基于 GPIO 的按钮和键盘
    模拟设备:支持模拟到数字转换(ADC)、数字到模拟转换(DAC)、多路复用器和放大器

    7  C/C++ 库

    完全集成在 OS 内的标准 C 库
    通过一个标准数学库提供浮点支持
    插件 uClibc++ 模块提供标准 C++ 库,支持 io 流、 字符串、 STL、 RTTI、异常等(LGPL)

    8  网络

    TCP/IP、 UDP、 ICMP、 IGMPv2(客户端)栈
    SLIP
    一个 cJSON 移植
    小型封装(基于 uIP)
    BSD兼容的套接字层
    网络实用程序(DHCP 服务器和客户端、SMTP 客户端、 TELNET 客户端、FTP 服务器和客户端、TFTP 客户端、HTTP 服务器和客户端、NTP 客户端)。可继承的 TELNET 会话(如“控制终端”)。
    NFS 客户端:客户端侧支持网络文件系统(NFS,版本3,UDP)
    一个 Jeff Poskanzer 的 THTTPD HTTP 服务器的 NuttX 移植,集成于 NXFLAT,提供嵌入式 CGI。
    UDP 网络发现, XML RPC 服务器
    支持网络模块(如 TI CC3000 WLAN 模块)

    9  Flash 支持

    灵感来自 MTD 的存储技术设备接口
    NAND 支持
    FTL:简单的 Flash 转换层,支持 FLASH 上的文件系统
    NXFFS: NuttX 损耗平衡 FLASH 文件系统
    支持基于 SPI 的 FLASH 设备

    10  USB 支持

    10.1  USB 主机支持
    USB 主机控制器驱动和设备依赖的 USB 类驱动的 USB 主机架构
    可用于 NXP LPC17xx 的 USB 主机控制器驱动
    可用于 USB 大容量存储设备和 HID 键盘的设备依赖的 USB 类驱动
    10.2  USB 设备支持
    USB 设备控制器驱动和设备依赖的 USB 类驱动的类 Gadget 架构
    可用于 PIC32、 NXP LPC17xx、 LPC214x、 LPC313x、 LPC43xx、 STMicro STM32F1x、 STM32F2x、 STM32F4x 和 TI DM320 的 USB 设备控制器驱动
    可用于 USB 串口和 USB 大容量存储设备的设备依赖的 USB 类驱动
    内建用于 USB 调试的 USB 追踪功能

    11  图形支持

    帧缓冲驱动
    并行端口和 SPI 端口的 LCD 和OLED 的图形 LCD 驱动
    段式 LCD 驱动
    NX Graphics 子系统:一个图形库、窗口化系统和字体支持,工作于帧缓冲或 LCD 驱动
    NuttX Widgets:用保守的 C++ 编写的图形用户界面,集成于 NX Graphics
    NuttX 窗口管理器:一个微型窗口管理器,基于 NX Graphics 子系统和 NuttX Widgets

    12  插件

    12.1  NuttShell
    一个用于 NuttX 的、小型的、可扩展的、类 bash 的 shell,具有丰富的特征集和小型封装。
    12.2  Pascal 运行时
    Pascal 插件可以从 SourceForge 网站下载。

    13  开发环境

    Linux + GNU make + GCC/binutils for Linux
    Linux + GNU make + SDCC for Linux
    Windows with Cygwin + GNU make + GCC/binutils (Cygwin下自定义构建)
    Windows with Cygwin + GNU make + SDCC (Cygwin下自定义构建)
    Windows with Cygwin + GNU make + Windows 本地工具链
    Windows 本地 (CMD.exe) + GNUWin32 (含 GNU make) + MinGW 主机 GCC 编译器 + Windows 本地工具链
    Wine + GNU make + Windows 本地工具链

    14  链接

    官方网站: http://www.nuttx.org
    Wiki: http://www.nuttx.org/doku.php?id=wiki
    下载: http://sourceforge.net/projects/nuttx

    展开全文
  • Nuttx驱动(二)实例

    2022-08-25 19:59:01
    Nuttx驱动例程

    接上一篇文章,这篇主要是nuttx驱动编写实践部分。基础部分请移驾《Nuttx驱动(一)简介》

    Nuttx驱动例程

    在该例程中,假设有这么一个设备:有3个IO输出和一个IO输入的RGB_LED设备,叫slimLED好了。(这里简单点就先不使用PWM控制了

    1. 创建字符设备驱动主体,即文件操作file_operations,然后实现open()close()read()write()ioctl()
    2. 注册该设备驱动到系统中,将会在系统的/dev目录下生成一个名为slimLED的设备节点;
    3. 通过应用程序来获取输入脚状态、控制三个输出脚状态。

    1. 驱动框架部分

    说明:在nuttx仓库中,实现slimLED这个驱动接口,系统层驱动与具体board无关。后期可以适配不同芯片或不同的board,所以尽可能灵活

    要修改如下文件(nuttx仓库)

    • Kconfig
    • Make.defs
    • slimLED.c
    • slimLED.h

    Kconfig 配置

    用于图形化配置工具的

    config SLIM_RGB_LED
    	bool "slim RGB led device support"
    	default n
    	---help---
    		Enable driver support for the slim LED controler.
    

    在这里插入图片描述
    在这里插入图片描述

    Make.defs

    # slim RGB LED
    
    ifeq ($(CONFIG_SLIM_RGB_LED), y)
      CSRCS += slimLED.c
    endif
    

    slimLED.h

    #ifndef __DRIVERS_SLIM_LED_H__
    #define __DRIVERS_SLIM_LED_H__
    
    /****************************************************************************
     * Included Files
     ****************************************************************************/
    #include <nuttx/config.h>
    #include <nuttx/compiler.h>
    
    /****************************************************************************
     * Pre-processor Definitions
     ****************************************************************************/
    #define SLEDIOC_SET         0x0001
    #define SLEDIOC_GET         0x0002
    
    struct slimled_status_s{
        bool state;
    };
    
    struct slimled_param_s{
        short num;
        struct slimled_status_s on;
    };
    
    struct slimled_lower_s{
        CODE int (*setio)(FAR struct slimled_lower_s *low, FAR struct slimled_param_s param);
        CODE int (*getio)(FAR struct slimled_lower_s *low, FAR struct slimled_status_s *status);
        CODE int (*ioctl)(FAR struct slimled_lower_s *low, int cmd, unsigned long arg);
    };
    
    int slimled_register(FAR const char *path,  FAR void *lower);
    
    #endif
    

    slimLED.c

    #include <nuttx/config.h>
    #include <stdlib.h>
    #include <fixedmath.h>
    #include <assert.h>
    #include <errno.h>
    #include <debug.h>
    #include <nuttx/kmalloc.h>
    #include <nuttx/fs/fs.h>
    #include <nuttx/sensors/slimled.h>
    
    
    #if defined(CONFIG_SLIM_RGB_LED)
    /****************************************************************************
     * Private Function Prototypes
     ****************************************************************************/
    static int  slimled_open(FAR struct file *filep);
    static int  slimled_close(FAR struct file *filep);
    static int  slimled_ioctl(FAR struct file *filep, int cmd, unsigned long arg);
    static int  slimled_read(FAR struct file *filep, FAR char *buffer, size_t buflen);
    static int  slimled_write(FAR struct file *filep, FAR const char *buffer,size_t buflen);
    
    /****************************************************************************
     * Private Data
     ****************************************************************************/
    static const struct file_operations slimled_fops = {
        .open   = slimled_open,
        .close  = slimled_close,
        .read   = slimled_read,
        .write  = slimled_write,
        .ioctl  = slimled_ioctl,
    };
    /****************************************************************************
     * Private Functions
     ****************************************************************************/
    
    /****************************************************************************
     * Name: slimled_ioctl
     ****************************************************************************/
    static int  slimled_open(FAR struct file *filep){
        return OK;
    }
    static int  slimled_close(FAR struct file *filep){
        return OK;
    }
    static int slimled_read(FAR struct file *filep, FAR char *buffer, size_t buflen){
        return OK;
    }
    static int slimled_write(FAR struct file *filep, FAR const char *buffer,size_t buflen){
        return OK;
    }
    static int slimled_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
    {
        FAR struct inode *inode    = filep->f_inode;
        FAR struct slimled_lower_s *lower = inode->i_private;
        int ret = OK;
    
        switch (cmd)
        {
            case SLEDIOC_SET:{
                FAR struct slimled_param_s param = {0};
                param.num = arg & 0xFF;
                param.on.state = (arg >> 8) & 0x03;
                ret = lower->setio(lower, param);
                break;
            }
            case SLEDIOC_GET:{
                FAR struct slimled_status_s *ptr = (FAR struct slimled_status_s*)((uintptr_t)arg);
                DEBUGASSERT(ptr != NULL);
                ret = lower->getio(lower, ptr);
                break;
            }
            default:
                ret = lower->ioctl(lower, cmd, arg);
            break;
        }
        return ret;
    }
    
    /****************************************************************************
     * Public Functions
     ****************************************************************************/
    
    /****************************************************************************
     * Name: slimled_register
     ****************************************************************************/
    
    int slimled_register(FAR const char *path, FAR struct slimled_lower_s *dev,
                          FAR void *lower)
    {
        int ret;
    
        DEBUGASSERT(path != NULL);
        DEBUGASSERT(lower != NULL);
    
        /* Register the slimled character driver */
        ret = register_driver(path, &slimled_fops, 0666, lower);
        if (ret < 0){
            _err("ERROR: Failed to register slim led driver: %d\n", ret);
        }
    
        return ret;
    }
    

    2. board适配层

    说明:在芯片级或 board 级仓库中,实现 slimLED 这个设备驱动,与具体的 芯片平台 或 board平台 进行绑定。构建设备驱动程序与硬件直接的桥梁

    要修改如下文件(board仓库)

    • Make.defs
    • configs/nsh/defconfig
    • board_def.h
    • bringup.c
    • platform_data.c
    • board_slimLED.h
    • board_slimLED.c

    Make.defs

    ifeq ($(CONFIG_SLIM_RGB_LED),y)
    CSRCS += board_slimled.c
    endif
    

    defconfig

    CONFIG_SLIM_RGB_LED=y
    

    board_def.h

    定义对应的IO口,以Apollo芯片为例

    #define SLIM_LED_R        (GPIO_PIN1 | GPIO_FUN_GPIO | GPIO_DRIVESTRENGTH_0P5X | GPIO_OUTCFG_PUSHPULL)
    #define SLIM_LED_G        (GPIO_PIN2 | GPIO_FUN_GPIO | GPIO_DRIVESTRENGTH_0P5X | GPIO_OUTCFG_PUSHPULL)
    #define SLIM_LED_B        (GPIO_PIN3 | GPIO_FUN_GPIO | GPIO_DRIVESTRENGTH_0P5X | GPIO_OUTCFG_PUSHPULL)
    #define SLIM_STA          (GPIO_PIN4 | GPIO_FUN_GPIO | GPIO_OUTCFG_DISABLE | GPIO_INPUT_ENABLE | GPIO_INTDIR_HI2LO)
    

    bringup.c

    初始化slim led设备,设备名和设备操作函数绑定及其初始化

    int board_bringup(void){
    	...
    #ifdef CONFIG_SLIM_RGB_LED
      ret = board_slimled_initialize("/dev/slimled", &slimled_pdata, eLED_CNT);
      if(ret < 0){
        printf("ERROR: slim led driver initialize failed: %d\n", ret);
      }
    #endif
    	...
    }
    

    platform_data.c

    const struct slimled_platform_data slimled_pdata[] = {
        {
          .pin   = SLIM_LED_R,
          .state = false,
        },
        {
          .pin   = SLIM_LED_G,
          .state = false,
        },
        {
          .pin   = SLIM_LED_B,
          .state = false,
        },
    };
    

    board_slimLED.h

    #ifndef __BOARD_SLIMLED_H__
    #define __BOARD_SLIMLED_H__
    
    #include <nuttx/config.h>
    #include <nuttx/regulator/fixed-regulator.h>
    
    typedef enum{
        eLED_R,
        eLED_G,
        eLED_B,
        eLED_CNT,
    }slimled_Num;
    
    struct slimled_platform_data{
        uint32_t pin;
        bool     state;
    };
    
    extern const struct slimled_platform_data slimled_pdata[];
    int board_slimled_initialize(const char *devpath, const struct slimled_platform_data *pdata, uint32_t cnt);
    
    #endif
    

    board_slimLED.c

    #include <nuttx/nuttx.h>
    #include <nuttx/irq.h>
    #include <nuttx/signal.h>
    #include <debug.h>
    #include <assert.h>
    #include <errno.h>
    
    #include <nuttx/err.h>
    #include "board_def.h"
    #include "board_slimLED.h"
    #include <slimLED.h>
    
    #ifdef CONFIG_SLIM_RGB_LED
    
    static bool _get_slimled_state(void);
    static void _set_slimled_param(FAR const struct slimled_lower_s *lower, FAR struct slimled_param_s param);
    
    static const struct slimled_lower_s slimled_lower = {
        .getio = _get_slimled_state,
        .setio = _set_slimled_param,
        .ioctl = _set_slimled_param,
    };
    
    
    /****************************************************************************
     * Private Functions
     ****************************************************************************/
    static bool _get_slimled_state(void){
        return gpioread(SLIM_STA);
    }
    
    static void _set_slimled_param(const struct slimled_lower_s *lower, struct slimled_param_s param){
        printf("%s %d %d\r\n", __func__, param.num, param.on.state);
    
        if(param.num < eLED_CNT){
            gpiowrite(slimled_pdata[param.num].pin, param.on.state);
        }
    }
    
    int board_slimled_initialize(const char *devpath, const struct slimled_platform_data *pdata, uint32_t cnt){
        if(cnt > eLED_CNT){
            printf("ERROR: slim led cnt setting error...\n");
            cnt = eLED_CNT;
        }
        for(uint8_t i=0;i<cnt;i++){
            configgpio(pdata[i].pin);
        }
        configgpio(SLIM_STA);
    
        return slimled_register(devpath, &slimled_lower);
    }
    
    #endif
    

    3. 应用层

    这里直接创建 slim led 应用线程

    #include <stdio.h>
    #include <stdbool.h>
    #include <sys/types.h>
    #include <fcntl.h>
    #include <pthread.h>
    #include <nuttx/config.h>
    #include <nuttx/analog/ioctl.h>
    #include <slimLED.h>
    #include <syslog.h>
    
    typedef enum{
        eCHANNEL_LED_R,
        eCHANNEL_LED_G,
        eCHANNEL_LED_B,
        eCHANNEL_LED_CNT,
    }slimled_channelTypeDef;
    static int led_fd = -1;
    
    static bool _slimled_init(void){
        led_fd = open("/dev/slimled", O_WRONLY);
        if(led_fd < 0){
            printf("slimled open failed\n");
            return false;
        }
        return true;
    }
    
    static bool _set_slimled_channal(slimled_channelTypeDef channel){
        struct slimled_param_s tmp[eCHANNEL_LED_CNT] = {0};
    
        if(channel > eCHANNEL_LED_CNT){
            printf("param setting error...\n");
            return false;
        }
        if(led_fd < 0){
            printf("slimled not opened yet\n");
            return _slimled_init();
        }
        for(uint8_t i=0;i<eCHANNEL_LED_CNT;i++){
            tmp[i].num = i;
            if(i == channel){
                tmp[i].on.state = true;
            }else{
                tmp[i].on.state = false;
            }
            ioctl(led_fd, SLEDIOC_SET, tmp[i]);
        }
    }
    
    
    void *slimled_Thread(void *arg){
        struct slimled_param_s slimled[3] = {0};
        int ret = 0;
        int sta = 0;
    
        if(false == _slimled_init()){
            return;
        }
    
        for(;;){
            for(uint8_t i=0;i<eCHANNEL_LED_CNT;i++){
                _set_slimled_channal(i);
                sleep(5);
            }
            ioctl(led_fd, TLEDIOC_GET, &sta);
            printf("= = == ioctl state: %d get IO state:%d= == =\n\n\n", ret, sta);
    	}
        close(led_fd);
        return;
    }
    
    — 完 —
    展开全文
  • Nuttx驱动(一)简介

    2022-08-25 10:51:49
    Nuttx驱动框架简介,记录一下学习和调试过程
  • APACHE NUTTX (INCUBATING)^^^^^^^^^^^^^^^^^^^^^^^^^o Introduction- Incubation Statuso Community- Getting Help- Mailing Lists- Issue Tracker- Source Code- Website Source Codeo Environments- Installing C...
  • 下载nuttX及编译1、NuttX官方链接2、NuttX及App工程下载3、编译NuttX中STM32F103V nsh测试例程4、在ubuntu下使用串口来烧录目录至STM32F103V4.1、ubuntu下stm32flash工具下载4.2、ubuntu下stm32flash工具编译及编译...
  • NuttX real time operating system for embedded devices
  • Nuttx编译系统

    2021-05-14 11:28:24
    配置Nuttx在编译之前需要先进行配置,而Nuttx是一个高度可配置的RTOS,Nuttx的配置文件使用kconfig-frontends工具来维护,配置工具将使用Kconfig文件,而Kconfig文件在Nuttx的代码文件夹中随处可见。每一个Kconfig...
  • nuttx-7.31源码 在px4官网教程进行虚拟机环境搭建后可编译烧写。已在STMF7以及H7开发板上验证
  • --------转载请注明出处文中使用的是nuttx-7.17Nuttx系统编译(主要针对arm体系结构):编译离不开工具链,而arm工具链是在各体系结构下的Toolchain.defs文件中定义的,arm7/9在nuttx\arch\arm\src\arm文件中,Cortex-...
  • Nuttx编译过程记录

    2020-09-05 18:25:46
    Nuttx开发 1开发环境 该系统需要在linux环境下开发, 本人在VMware Workstation虚拟机中安装centos 6.6作为开发环境; 一下开发均在centos6中开发、编译。 2安装kconfig配置前端 网上下载kconfig-frontends-...
  • ArduPilot项目ArduPilot项目由以下组成: ArduCopter(或APM:Copter):, ArduPlane(或APM:Plane):, ArduRover(或APMrover2):, ArduSub(或APM:Sub):, 天线跟踪器:, 用户支持和讨论论坛支持论坛: ...
  • NuttX启动过程分析

    2022-04-14 11:25:17
    1、系统启动过程
  • nuttx os api

    2015-07-06 11:47:34
    This manual provides general usage information for the NuttX RTOS from the perspective of the firmware developer.
  • nuttx启动过程

    2022-05-03 01:55:21
    本文以stm32f4discovery开发板为例子,分析nuttx的启动过程。 nuttx软件版本:10.2.0 硬件:stm32f4discovery开发板 nuttx启动过程分析参考文章:1.nuttx在STM32F767平台上的启动过程分析 2.nuttx启动过程分析 ...
  • NUTTX OS用户手册

    热门讨论 2015-07-03 14:06:52
    NUTTX OS用户手册 包含所有NUTXX的API应用介绍。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,073
精华内容 829
关键字:

nuttx