国产MCU-CW32F030开发学习--移植rtthread-nano

news2024/11/25 7:32:05

国产MCU-CW32F030开发学习–移植rtthread-nano

硬件平台

  1. CW32_48F大学计划板
  2. CW32_IOT_EVA物联网开发评估套件
    在这里插入图片描述
    在这里插入图片描述

RT-Thread Nano

RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用于家电、消费电子、医疗设备、工控等领域大量使用的 32 位 ARM 入门级 MCU 的场合。

下图是 RT-Thread Nano 的软件框图,包含支持的 CPU 架构与内核源码,还有可拆卸的 FinSH 组件:
在这里插入图片描述

支持架构:ARM:Cortex M0/ M3/ M4/ M7 等、RISC-V 及其他。

功能:线程管理、线程间同步与通信、时钟管理、中断管理、内存管理。

RT-Thread Nano的特点

  1. 下载简单

    RT-Thread Nano 以软件包的方式集成在 Keil MDK 与 CubeMX 中,可 以直接在软件中下载 Nano 软件包获取源码,获取方式详见 基于 Keil MDK 移植 RT-Thread Nano 与 基于 CubeMX 移植 RT-Thread Nano 。同时也提供 下载 Nano 源码压缩包 的途径,方便在其他开发环境移植 RT-Thread Nano,如 基于 IAR 移植 RT-Thread Nano。

  2. 代码简单
    与RT-Thread 完整版不同的是,Nano 不含 Scons 构建系统,不需要 Kconfig 以及 Env 配置工具,也去除了完整版特有的 device 框架和组件,仅是一个纯净的内核。

  3. 移植简单
    由于 Nano 的极简特性,使 Nano 的移植过程变得极为简单。添加 Nano 源码到工程,就已完成 90% 的移植工作。

  4. 使用简单
    RT-Thread Nano 在使用上也非常简单,带给开发者友好的开发体验。

  5. 易裁剪:Nano 的配置文件为 rtconfig.h,该文件中列出了内核中的所有宏定义,有些默认没有打开,如需使用,打开即可。具体的配置可见 Nano 版块的 RT-Thread Nano 配置 教程。

  6. 易添加 FinSH 组件:FinSH 组件 可以很方便的在 Nano 上进行移植,而不再依赖 device 框架,只需要对接两个必要的函数即可完成 FinSH 移植。

  7. 资源占用小:对 RAM 与 ROM 的开销非常小,在支持 semaphore 和 mailbox 特性,并运行两个线程 (main 线程 + idle 线程) 情况下,ROM 和 RAM 依然保持着极小的尺寸,RAM 占用约 1K 左右,ROM 占用 4K 左右。
    注:如果需要丰富的组件、驱动以及软件包等功能,则建议使用 RT-Thread 完整版。

移植过程

  1. 打开一个支持串口printf打印的工程模板

  2. 打开manage Run-Time Environment工具,选择RT-Thread,我们这里只选择kenel。
    在这里插入图片描述

  3. 打开RTOS目录下的board.c文件,添加main.h头文件的引用、添加系统心路中断函数、添加systick初始化。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  4. 打开rtthconfig.h中内存管理的选项
    在这里插入图片描述

  5. 注释掉interrupts_cw32放0.c中HardFault_Handler、PendSV_Handler两个函数,避免出现得新定义的错误
    在这里插入图片描述
    在这里插入图片描述

  6. 注释掉cw32f030_systick.c中的SysTick_Handler函数,避免出现得新定义的错误
    在这里插入图片描述

  7. 在main.c中添加rtthreah.h的头文件引用,再添回两个任务函数,并在主程序中启动

#include "main.h"
#include <rtthread.h>
//常用头文件放置main.h
struct rt_thread thread1;
struct rt_thread thread2;
char thread1_stack[512];
char thread2_stack[512];


void thread1_entry(void*param)
{

    while (1)
    {
        printf("thread1 is runningrn \n");
        rt_thread_mdelay(500);
    }

}
void thread2_entry(void*param)
{

    while (1)
    {
        printf("thread2is runningrn \n");
        rt_thread_mdelay(3000);
    }

}

void thread1_init(void)
{
    rt_err_t fd=rt_thread_init(&thread1,"thread1",
                               &thread1_entry,0,
                               &thread1_stack[0],
                               sizeof(thread1_stack),10,10);
    if(fd < 0)   
    {
        printf("thread1 init is fail rn \n");  
    }
    else
    {
        printf("thread1init is success rn \n");
    }

    rt_thread_startup(&thread1);

}

void thread2_init(void)
{
    rt_err_t fd=rt_thread_init(&thread2,"thread2",
                               &thread2_entry,0,
                               &thread2_stack[0],
                               sizeof(thread2_stack),10,10);
    if(fd < 0)
    {
        printf("thread2 init is fail rn \n");  
    }
    else
    {
        printf("thread2init is success rn \n");
    }
    rt_thread_startup(&thread2);
}


int32_t main(void)
{
	RCC_Configuration(); //时钟配置64M,时钟配置以移动到systejm_cw32f030.h
	UART_Configuration();//printf函数初始化,函数主体在Debug.c,使用串口1,和大学板的LED3冲突。
    thread1_init();
    thread2_init();
    printf("cw32f030-rtthread init \n");
	while(1)
	{
	
	}
	
}

测试效果

在这里插入图片描述
移植可能还有问题,只是初步移植,目前能串口打印,但是我感觉串口打印有乱七八糟码,而且打印速度非常快,可能这个部分有问题,后面看看能否移植FinSH组件

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

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

相关文章

git clone 丢东西

1. git clone 丢东西 使用git clone https://gitee.com/123456789/123456789.git 克隆gitee 远程库上的代码发现少了一部分&#xff0c;只克隆了一部分下来&#xff0c;反复删除重新克隆都是一样的结果 2. 克隆下来后的文件&#xff0c;该目录下只有5 个文件&#xff0c;少了…

一文读懂北斗三号短报文!通信频度、电文长度、北斗民用智能卡申请、典型终端全面介绍

一、北斗短报文概述 北斗卫星导航系统&#xff08;Beidou Navigation Satellite System&#xff09;是中国自主研发和建设的全球卫星导航系统。该系统由一系列卫星、地面监控站和用户终端组成&#xff0c;旨在提供高精度、高可靠性的定位、导航和授时服务。北斗卫星导航系统的发…

QT编写的数字键盘

https://download.csdn.net/download/qq_20189555/88001237

Heroku 实践:如何成功将 Vue.js 的前端内容部署到 Heroku

文章目录 Vue.js 脚手架安装Vue CLI&#xff08;如果你还没有安装&#xff09;&#xff1a;创建新项目 Heroku 部署 Vue2项目目录server.jspackage.json创建 Procfile按照 heroku 的引导初始化 git 并提交代码 可能问题 Vue.js 脚手架 首先要使用 Vue 的脚手架来创建一个 vue …

nodeJs学习笔记

创建服务器 在根目录下创建server.js的文件&#xff0c;里面写如入以下代码&#xff1a; // 请求nodejs自带的http模块 var http require(http);http.createServer(function (request, response) {// 发送 HTTP 头部 // HTTP 状态值: 200 : OK// 内容类型: text/plainrespon…

Update the WSL kernel by running “wsl --update“ or……【老电脑装Docker】

给老电脑装Docker遇到了这个问题记录一下 Update the WSL kernel by running “wsl --update” or follow instructions at https://docs.microsoft.com/windows/wsl/wsl2-kernel. 打开Docker一直报这个界面&#xff0c;然后就退出 根据上面的意思&#xff0c;试着更新了下 …

汇编学习教程:走进 bp

引言 此前我们学习了 bp 寄存器&#xff0c;我们知道 bp 的作用是为访问栈空间数据提供方便&#xff0c;其默认绑定的段寄存器就是 SS 段寄存器。在此前的博文中博主提及到&#xff0c;bp 的作用其实不止方便访问栈空间数据这一条&#xff0c;对于栈如此重要的空间&#xff0c…

区块链技术:解锁未来的去中心化革命

在数字时代的浪潮中&#xff0c;区块链技术如一颗璀璨的明星崛起&#xff0c;被誉为解锁未来的去中心化革命。作为一种分布式账本技术&#xff0c;区块链不仅改变着传统商业模式&#xff0c;还催生了全新的经济形态和社会关系。本文将从技术原理、应用场景和前景展望三个方面&a…

spring security权限路由匹配restful格式的详情id设计

解决方案&#xff1a; 先直接说下解决方案&#xff0c;权限点设计成如下&#xff1a; /api/books/{id:\d*}问题描述&#xff1a; 获取书本详情的标准restful路由&#xff0c;一般是这样的/api/books/12&#xff0c; 12即该book的id&#xff0c;如果需要拥有访问该路由的权限…

【C语言初阶】带你轻松掌握指针基础知识(1)——指针的定义,类型,大小

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello&#xff0c;这里是君兮_&#xff0c;最近刚回家有点懒&#xff0c;从今天开始恢复更新并开始更新新的刷题系列&#xff0c;我们先继续更新0基础入门C语言的内容&#xff0c;今天给大家带来的是指针方面的内容&…

【MYSQL基础】MYSQL用户管理

MYSQL用户管理 数据库的root用户拥有操作数据库的所有权限&#xff0c;如果要团队协作开发&#xff0c;为了避免有成员误操作&#xff0c;可以给成员创建一个权限较低的用户账号 创建用户 create user 用户名 identified by ‘密码’; mysql> create user dam identified …

数据劫持大揭秘:Vue的隐形力量和无限可能

文章目录 1. 初始化阶段2. 响应式侦测器3. 数据劫持4. 模板编译5.总结 Vue.js 通过数据劫持实现了数据的双向绑定。它使用了一个名为 “响应式系统” 的机制来追踪和响应数据的变化&#xff0c;从而自动更新相关的视图。 Vue 的数据劫持原理主要分为以下几个步骤&#xff1a; …

main函数和其他函数

##什么是main函数函数就很敏感&#xff0c;在我认为的函数函数就是功能 有系统给的也有自己写的 函数就是一个封装好的功能 function 函数&#xff0c;功能。main函数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9a92f39cf6a842f5a56dbc1689012ceb.png 函数的参数&am…

高压放大器工作原理以及参数介绍

高压放大器是一种电子器件&#xff0c;其主要作用是将输入信号的电压放大到输出端。由于高压放大器的输入和输出端的电平差很大&#xff0c;因此需要使用特殊的材料和技术来保证电路的可靠性和稳定性。下面我们就来详细介绍一下高压放大器的工作原理和参数介绍。 图&#xff1a…

推荐4款好用的在线作图软件,可一键安装

本文将介绍4个功能强大又可以免费使用的在线作图软件&#xff0c;可以帮助设计师更快地完成绘图工作&#xff0c;一起来看看吧&#xff01; 1.即时设计 即时设计是一款功能强大的在线作图软件&#xff0c;它提供了丰富的绘图工具、层管理和样式库&#xff0c;让设计师可以轻松…

集群 第二章

目录 1.DR 模式 LVS 负载均衡群集部署 2.总结 1.DR 模式 LVS 负载均衡群集部署 DR 服务器&#xff1a; 192.168.83.104 NFS服务器&#xff1a; 192.168.83.103 Web 服务器1&#xff1a; 192.168.83.102 Web 服务器2&#xff1a; 192.168.83.101 …

(八)解析函数的无穷可微性与 Cauchy 型积分定理

本文主要内容包括&#xff1a; 1. 解析函数的无穷可微性1.1. 解析函数的高阶导数1.2. 导数估计式 —— Cauchy 不等式1.3. Liouville 定理1.4. 代数基本定理的一种证明 2. Cauchy 型积分定理2.1. Cauchy 型积分2.2. Cauchy 型积分定理 1. 解析函数的无穷可微性 1.1. 解析函数的…

状态检测防火墙

状态检测防火墙原理 对于已经存在会话表的报文的检测过程比没有会话表的报文要短很多。通过对一条连接的首包进行检测并建立会话后,该条连接的绝大部分报文都不再需要重新检测。这就是状态检测防火墙的“状态检测机制”,相对于包过滤防火墙的“逐包检测机制”的改进之处。这种…

黑马点评(达人探店)

达人探店 一、发布探店笔记 发布探店笔记功能是项目本身就完成了的功能&#xff0c;他会把图片存在本地&#xff0c;有兴趣可以去看源码&#xff0c;在UploadCOntroller类下 二、查看探店笔记 这个功能项目本身是没有完成这个接口的&#xff0c;所以需要我们自己去完成。 …

点击echart图即可获取对应代码的网址

PPChart - 让图表更简单 点击第一个数据中心即可获取对应的代码