15、【OS】【Nuttx】OS裁剪,运行指定程序,周期打印当前任务

news2024/12/28 17:06:23

背景

接之前wiki【Nsh中运行第一个程序】https://blog.csdn.net/nobigdeal00/article/details/144728771
OS还是比较庞大,且上面搭载了Nsh(Nuttx Shell),需要接入串口才能正常工作,一般调试的时候用,非调试的时候,可以取消以节省空间

目标

裁剪掉Nuttx shell,并在OS启动后,运行指定程序,周期打印当前OS上运行的任务

配置Nuttx Demo

进入到Nuttx项目目录,运行

make distclean

清除掉之前项目配置残留后,运行

adminpc@adminpc:~/nuttx$ ./tools/configure.sh -l sim:ostest
  Copy files
  Select CONFIG_HOST_LINUX=y
  Refreshing...
CP: arch/dummy/Kconfig to /home/adminpc/nuttx/arch/dummy/dummy_kconfig
CP: boards/dummy/Kconfig to /home/adminpc/nuttx/boards/dummy/dummy_kconfig
LN: platform/board to /home/adminpc/nuttx-apps/platform/dummy
LN: include/arch to arch/sim/include
LN: include/arch/board to /home/adminpc/nuttx/boards/sim/sim/sim/include
LN: drivers/platform to /home/adminpc/nuttx/drivers/dummy
LN: include/arch/chip to /home/adminpc/nuttx/arch/sim/include/sim
LN: arch/sim/src/chip to /home/adminpc/nuttx/arch/sim/src/sim
LN: arch/sim/src/board to /home/adminpc/nuttx/boards/sim/sim/sim/src
mkkconfig in /home/adminpc/nuttx-apps/audioutils
mkkconfig in /home/adminpc/nuttx-apps/benchmarks
mkkconfig in /home/adminpc/nuttx-apps/boot
mkkconfig in /home/adminpc/nuttx-apps/canutils
mkkconfig in /home/adminpc/nuttx-apps/crypto
mkkconfig in /home/adminpc/nuttx-apps/database
mkkconfig in /home/adminpc/nuttx-apps/examples/mcuboot
mkkconfig in /home/adminpc/nuttx-apps/examples/module
mkkconfig in /home/adminpc/nuttx-apps/examples/sotest
mkkconfig in /home/adminpc/nuttx-apps/examples
mkkconfig in /home/adminpc/nuttx-apps/fsutils
mkkconfig in /home/adminpc/nuttx-apps/games
mkkconfig in /home/adminpc/nuttx-apps/graphics
mkkconfig in /home/adminpc/nuttx-apps/industry
mkkconfig in /home/adminpc/nuttx-apps/inertial
mkkconfig in /home/adminpc/nuttx-apps/interpreters/luamodules
mkkconfig in /home/adminpc/nuttx-apps/interpreters
mkkconfig in /home/adminpc/nuttx-apps/logging
mkkconfig in /home/adminpc/nuttx-apps/lte
mkkconfig in /home/adminpc/nuttx-apps/math
mkkconfig in /home/adminpc/nuttx-apps/mlearning
mkkconfig in /home/adminpc/nuttx-apps/netutils
mkkconfig in /home/adminpc/nuttx-apps/sdr
mkkconfig in /home/adminpc/nuttx-apps/system
mkkconfig in /home/adminpc/nuttx-apps/testing
mkkconfig in /home/adminpc/nuttx-apps/videoutils
mkkconfig in /home/adminpc/nuttx-apps/wireless/bluetooth
mkkconfig in /home/adminpc/nuttx-apps/wireless/ieee802154
mkkconfig in /home/adminpc/nuttx-apps/wireless
mkkconfig in /home/adminpc/nuttx-apps
#
# configuration written to .config
#

配置一个模拟器的测试demo,该demo默认不带Nsh,接着运行

make menuconfig

打开配置界面,选择Application Configuration
在这里插入图片描述
选择Testing
在这里插入图片描述
找到OS test example,按n取消选定,我们这里是借鸡下蛋,不用ostest
在这里插入图片描述
回到配置主界面,选择File Systems,把里面的配置项都清空,不用文件系统
在这里插入图片描述
选择Save保存配置后,退出

编写app

进入nuttx-apps目录,新建个目录myapp,目录下有文件如下
/nuttx-apps/myapp/Kconfig
/nuttx-apps/myapp/Make.defs
/nuttx-apps/myapp/Makefile
/nuttx-apps/myapp/myapp_main.c

  • Kconfig代码如下,这里MYAPP为配置项(在.config文件中名称),该配置项名称为"My Application"(在make menuconfig时界面显示名称),类型为bool,默认不打开
config MYAPP
    bool "My Application"
    default n
    help
      This is a description of your application
  • Make.defs代码如下,这里对.config文件中的配置项CONFIG_MYAPP做判断,如果存在该配置项,则将该文件夹下的文件参与构建
ifneq ($(CONFIG_MYAPP),)
CONFIGURED_APPS += $(APPDIR)/myapp
endif
  • Makefile代码如下,程序输出件的名字为myapp,调度优先级默认
include $(APPDIR)/Make.defs

PROGNAME = myapp
PRIORITY = SCHED_PRIORITY_DEFAULT

CSRCS = myapp_main.c

include $(APPDIR)/Application.mk
  • myapp_main.c代码如下,这里将每隔5s打印一次OS中正在运行的task
#include <nuttx/config.h>
#include <stdio.h>
#include <nuttx/sched.h>

void print_tasks(void)
{
    struct sched_param param;
    int pid;
    // 遍历所有可能的 PID(假设最大 PID 为 256)
    for (pid = 0; pid < 256; pid++) {
        // 获取任务控制块
        struct tcb_s *tcb = nxsched_get_tcb(pid);
        if (tcb != NULL) {
            // 获取任务名称和优先级
            if (sched_getparam(pid, &param) == OK) {
                printf("Task: %s (PID=%d, Priority=%d)\n", 
                       tcb->name, pid, param.sched_priority);
            }
        }
    }
}

int myapp_main(int argc, char *argv[])
{
    while (1) {
        print_tasks();
        sleep(5); // 每隔5秒打印一次任务列表
    }
    return 0;
}

配置Nuttx myapp

再次回到nuttx目录下,运行

make menuconfig

打开配置界面后,选择RTOS Features
在这里插入图片描述
选择Tasks and Scheduling
在这里插入图片描述
将Application entry point和Application entry name改成我们刚才的程序入口myapp_main
在这里插入图片描述
回到配置主界面,选择Application Configuration
在这里插入图片描述
选择我们刚才新建的My Application
在这里插入图片描述
保存配置,退出

构建

回到nuttx目录下,运行make clean;make执行构建

adminpc@adminpc:~/nuttx$ make clean; make
LD:  nuttx
Pac SIM with dynamic libs..
'/lib/x86_64-linux-gnu/libm.so.6' -> 'sim-pac/libs/libm.so.6'
'/lib/x86_64-linux-gnu/libc.so.6' -> 'sim-pac/libs/libc.so.6'
'/lib64/ld-linux-x86-64.so.2' -> 'sim-pac/ld-linux-x86-64.so.2'
SIM elf with dynamic libs archive in nuttx.tgz

查看nuttx目录下的可执行文件nuttx,1709624字节,1.63M,比之前wiki【Nsh中运行第一个程序】https://blog.csdn.net/nobigdeal00/article/details/144728771小了一半多空间,之前3.57M

adminpc@adminpc:~/nuttx$ ll | grep nuttx
lrwxrwxrwx  1 adminpc adminpc      65 Dec 27 23:01 Make.defs -> /home/adminpc/nuttx/tools/../boards/sim/sim/sim/scripts/Make.defs
-rwxrwxr-x  1 adminpc adminpc 1709624 Dec 27 23:33 nuttx*
-rw-rw-r--  1 adminpc adminpc      27 Dec 27 23:33 nuttx.manifest
-rw-rw-r--  1 adminpc adminpc  129277 Dec 27 23:33 nuttx.map
-rw-rw-r--  1 adminpc adminpc 2082049 Dec 27 23:33 nuttx.tgz

内核大小333184字节,325.375K,为之前内核大小的四分之一,之前内核大小为1.19M
在这里插入图片描述

最终效果

运行程序,可周期打印出OS中的任务信息

adminpc@adminpc:~/nuttx$ ./nuttx 
Task: Idle_Task (PID=0, Priority=100)
Task: loop_task (PID=1, Priority=224)
Task: hpwork (PID=2, Priority=224)
Task: myapp_main (PID=3, Priority=100)

Task: Idle_Task (PID=0, Priority=100)
Task: loop_task (PID=1, Priority=224)
Task: hpwork (PID=2, Priority=224)
Task: myapp_main (PID=3, Priority=100)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 窗体应用程序嵌套web网页,基于谷歌浏览器内核(含源码)

有一个winform项目&#xff0c;需要借助一个web项目来显示&#xff0c;并且对web做一些操作,web页目是需要用谷歌内核&#xff0c;基于谷歌 Chromium项目的开源Web Browser控件来开发写了一个demo。 安装步骤 第一步&#xff1a;右键项目&#xff0c;点击 管理NuGet程序包 , 输…

通过远程控制软件实现企业高效协作

在这个信息技术迅猛发展的时代&#xff0c;远程办公已经成为一种趋势&#xff0c;而远程控制软件则是连接分散团队的重要工具。技术的革新不仅推动了远程控制软件的广泛应用&#xff0c;也为现代办公带来了高效的协作体验。本文将探讨远程控制软件的发展&#xff0c;并以RayLin…

赋能开发者 | 麒麟信安受邀参加2024开放原子开发者大会,以技术为引领,以人才创发展

12月20至21日&#xff0c;以“一切为了开发者”为主题的“2024开放原子开发者大会暨首届开源技术学术大会”在湖北武汉举办。本届大会由开放原子开源基金会、中国通信学会联合主办&#xff0c;旨在贯彻落实国家软件发展战略&#xff0c;加速培育壮大我国开源生态。工业和信息化…

每天40分玩转Django:Django国际化

Django国际化 一、今日学习内容概述 学习模块重要程度主要内容国际化基础⭐⭐⭐⭐⭐基本概念、配置设置字符串翻译⭐⭐⭐⭐⭐翻译标记、消息文件模板国际化⭐⭐⭐⭐模板标签、过滤器动态内容翻译⭐⭐⭐⭐模型字段、表单翻译 二、国际化基础配置 # settings.py# 启用国际化 …

Elasticsearch 国产化替代方案之一 Easysearch 的介绍与部署指南

一、前言 在国内数字化转型浪潮和 信创 大背景下&#xff0c;“替代进口”成为许多企业级应用所需要面对的重要课题&#xff0c;搜索领域也不例外。 Elasticsearch&#xff08;简称 ES&#xff09;作为一款业界领先的全文搜索和分析引擎&#xff0c;虽然功能强大&#xff0c;但…

Ubuntu 24.04.1 LTS 配置静态固定IP地址

查看网络配置信息 ip addr使用该命令查看网卡名字&#xff0c;一般是ens33或者ens32 修改配置文件 打开 /etc/netplan/下面的yaml配置文件 根据自己的需要配置 network:ethernets:ens33: # 配置的网卡的名称addresses: [192.168.23.140/24] # 配置的静态ip地址和掩码d…

Deep Deterministic Policy Gradient (DDPG)算法

代码 import torch import torch.nn as nn import torch.optim as optim import numpy as np import gym import random from collections import deque# 定义 Actor 网络 class Actor(nn.Module):def __init__(self, state_dim, action_dim, max_action):super(Actor, self).…

C++ OCR 文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘

学习爬虫时&#xff0c;遇到如下报错&#xff1a; 报错原因&#xff1a; 正则表达式的 search 或 finditer 方法没有找到任何匹配项&#xff0c;可能是换行符处理不当等。 解决方法如下&#xff1a; 在正则表达式末尾加上re.S即可&#xff0c;re.S是一个编译标志&#xff0c…

JVM实战—3.JVM垃圾回收的算法和全流程

大纲 1.JVM内存中的对象何时会被垃圾回收 2.JVM中的垃圾回收算法及各算法的优劣 3.新生代和老年代的垃圾回收算法 4.避免本应进入S区的对象直接升入老年代 5.Stop the World问题分析 6.JVM垃圾回收的原理核心流程 7.问题汇总 1.JVM内存中的对象何时会被垃圾回收 (1)什么…

基于SpringBoot在线音乐系统平台功能实现十八

一、前言介绍&#xff1a; 1.1 项目摘要 随着互联网技术的迅猛发展和普及&#xff0c;人们对音乐的获取和欣赏方式发生了巨大改变。传统的音乐播放方式&#xff0c;如CD、磁带或本地下载的音乐文件&#xff0c;已经不能满足用户日益增长的需求。用户更希望通过网络直接获取各…

RouYi-Vue框架,环境搭建以及使用

使用若以框架需要配置node.js&#xff0c;如果不了解可以去看node.js安装&#xff0c;uni-app的配置使用_uniapp使用nodejs类库-CSDN博客 安装若依 首先是去若以官网下载自己所需要的框架类型 RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff…

XL系列433芯片、2.4G收发芯片 通讯对码说明

XL系列433芯片对码说明&#xff1a; 发射芯片 XL4456 通过数据脚接收高低电平然后经过调制将波形发出&#xff0c;而接收芯片 XL520 通过接收波形后进行解调&#xff0c;数据脚输出高低电平。至于具体的通信协议&#xff0c;需要用户自定义&#xff0c;一般而言&#xff0c;使…

蓝牙BLE开发——解决iOS设备获取MAC方式

解决iOS设备获取MAC方式 uniapp 解决 iOS 获取 MAC地址&#xff0c;在Android、iOS不同端中互通&#xff0c;根据MAC 地址处理相关的业务场景&#xff1b; 文章目录 解决iOS设备获取MAC方式监听寻找到新设备的事件BLE工具效果图APP监听设备返回数据解决方式ArrayBuffer转16进制…

期权懂|如何计算期权卖方平仓后的盈利?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 如何计算期权卖方平仓后的盈利&#xff1f; 期权卖方平仓后的盈利计算涉及多个因素&#xff0c;包括期权的交易价格、平仓价格以及权利金的变动等。 交易价格&#xff1a;期权卖…

QT:一个TCP客户端自动连接的测试模型

版本 1:没有取消按钮 测试效果&#xff1a; 缺陷&#xff1a; 无法手动停止 测试代码 CMakeLists.txt cmake_minimum_required(VERSION 3.19) project(AutoConnect LANGUAGES CXX)find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets Network)qt_standard_project_setup(…

uniapp中wx.getFuzzyLocation报错如何解决

一、用wx.getLocation接口审核不通过 用uniapp开发小程序时难免需要获取当前地理位置。 代码如下&#xff1a; uni.getLocation({type: wgs84,success: function (res) {console.log(当前位置的经度&#xff1a; res.longitude);console.log(当前位置的纬度&#xff1a; r…

解决Ubuntu下无法装载 Windows D盘的问题

电脑安装了 Windows 和 Ubuntu 24.04 后&#xff0c;在Ubuntu系统上装载 D盘&#xff0c;发现无法装载错误如下&#xff1a; Error mounting /dev/nvme0n1p4 at /media/jackeysong/Data: wrong fs type, bad option, bad superblock on /dev/nvme0n1p4, missing codepage or h…

硬件设计-高速电路的过孔

目录 摘要 &#xff1a; 过孔的机械特性&#xff1a; 过孔直径&#xff1a; 过孔焊盘尺寸 摘要 &#xff1a; 过孔这个词指得是印刷电路板&#xff08; PCB &#xff09;上的孔。过孔可以用做焊接插装器件的焊&#xff08; Through hole) &#xff0c;也可用做连接层间走…

mysql索引的理解

1、索引是什么&#xff1f; 索引&#xff1a;简单理解就是我们字典的目录&#xff0c;一个索引可以找得到多个记录。 作用加快我们数据库的查询速度。索引本身较大&#xff0c;往往存储在磁盘的文件里。可能存储在单独的索引文件中&#xff0c;也可能和数据一起存储在数据文件…