Renode应用:在RISC-V核上运行FreeRTOS

本篇记录通过Renode在RISC-V核上运行FreeRTOS demo的情况。本来不准备写这一篇,但是发现近期工作学习密度实在太大,上周工作的中间结果这周竟然完全想不起来了,不得不又花了一些时间从头摸索着重新配置了一遍,好记性是没指望了,只能依赖烂笔头。

该例中使用的是MiFive M2GL025开发板(当然,是通过Renode模拟的),集成开发环境是SoftConsole,具体可以参考:RTOS Demo for RISC-V MiFive M2GL025 / Renode - FreeRTOS

一. 准备工作

在开始之前,先准备好所有的素材:

1. FreeRTOS源码

FreeRTOS源码下载地址如下:  

FreeRTOS - Free RTOS Source Code Directory Structure

该套源码中包含了FreeRTOS核心代码,以及在各个平台上的应用代码,另外,包含了很多个Demo,我们运行的Demo就在其中。源码包的结构如下:

+-FreeRTOS-Plus    Contains FreeRTOS+ components and demo projects.
|
+-FreeRTOS         Contains the FreeRTOS real time kernel source
    |               files and demo projects
	|
    |
    +-Source            The core FreeRTOS kernel files
    |    |
    |    +-include      The core FreeRTOS kernel header files
    |    |
    |    +-Portable     Processor specific code.
    |        |
    |        +-Compiler x      All the ports supported for compiler x
    |        +-Compiler y      All the ports supported for compiler y
    |        +-MemMang         The sample heap implementations
    |
    +-Demo
        |
        +-Common    The demo application files that are used by all the demos.
        +-Dir x     The demo application build files for port x
        +-Dir y     The demo application build files for port y

FreeRTOS核心代码放在FreeRTOS/Source目录下,主要在三个文件中:tasks.c, queue.c和list.c,同时,该目录下还包含两个可选文件timers.c和croutine.c,分别用以实现软件定时器和co-routines。

对于FreeRTOS支持的每一种处理器,都有少量基于该架构的RTOS代码,这部分代码作为可移植部分,放在FreeRTOS/Source/Portable目录下。

FreeRTOS/Demo目录下放置了很多预置好的演示用例,通过指令集名称+仿真平台+编译器等命名,例如我们要运行的Demo名称为:RISC-V_Renode_Emulator_SoftConsole。

2. SoftConsole 

本篇描述的Demo通过Softconsole集成开发环境编译运行,下载地址如下:

SoftConsole | Microsemi

该开发环境将外部工具例如Renode也集成了进去,因此使用起来较为方便。

二. 代码编译

这次仍然运行LED闪烁的Demo。通过两个任务之间的交互来完成LED闪烁:发送任务每隔1秒(在Renode上为虚拟秒)将一个数值送入队列;接收任务在接收到该数值时(队列为空时接收任务会被阻塞),将字符串“Blink”打印到Renode控制台。

1. 导入工程

通过File->Import导入已有工程:

在Import Projects页面,选择FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole目录,如下图:

点击“Finish”完成导入。

 2. 编译

在“Project”菜单选择“Build All”进行编译。

三. 运行

1. 工具配置 

完成编译后,会生成目标文件RTOSDemo.elf,放在Debug目录下:

接下来,我们通过SoftConsole内嵌的Renode工具,仿真MiFive M2GL025平台,并运行该目标文件。

首先,我们需要配置外部工具,选择“Run”->“External Tools”->"External Tools Configuration",如下图所示:

点击进入后,在"Program"上右键点击新建Configuration,在出现的窗口中填写如下几项内容:

其中,Arguments为Renode的输入参数,可以为空,也就是启动一个空的Renode,启动后再往里面依次创建machine、load platform、load binary、start等步骤,方便起见,可以把这些步骤写入一个RESC描述文件中,上图中的RESC文件为本人修改后的文件,内容如下:

2. 运行

 完成以上第三方工具配置后,点击“Run”运行,输出如下:

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释下面代码功能#include<iostream> #include<cstring> #include<cmath> using namespace std; int Node[50]; int number; int Calculate(char x)//计算偏移 { if(x>=97&&x<=122) return 0; switch(x) { case '!': case '^': case '(': case ')': return 1; case '|': case '-': return 2; case '<': return 3; default: return 1; } } int CalculateOut(string &Word,int n,int m)//输出||、->、<->,等等 { int i; if(m!=0) { for(i=1; i<m; i++)cout<<Word[n+i]; if(Word[i+n]!='\0') cout<<" "; } } int Input(string &Word)//输出数据 { int m,i,tag,q; number=0; for(i=0; Word[i]!='\0'; ) { q=i; if(Word[i]==' ') { i++; continue; } cout<<Word[i]; tag=Calculate(Word[i]); CalculateOut(Word,i,tag); i+=tag;//偏移 if(!tag)//数字计数 { Node[Word[q]-97]++; number++; if(Word[i+1]!='\0') cout<<" "; i++; } } cout<<endl; return number; } int Bin(int n,int m) { int bin[10000]; int a,b,i=0; do { a=n%2; n/=2; bin[i++]=a; } while(n>0); for(n=0; n<m-i; n++) { cout<<"0 "; } for(n=i-1; n>=0; n--) { cout<<bin[n]; if(n) cout<<" "; } } int Outnumber(int n) { int i,m=1; for(i=1; i<n; i++) { m=m*2+1; } for(i=m; i>=0; i--) { Bin(i,n); cout<<endl; } } void CoutNode() { int i,temp=0; for(i=0; i<50; i++) { if(temp==0&&Node[i]!=0) { cout.put(97+i); temp++; } else if(Node[i]!=0) { cout<<" "; cout.put(97+i); temp++; } } number=temp; cout<<endl; } int ReNode()//初始化 { for(int i=0; i<110; i++) Node[i]=0; } int Turn(char Map[400],string &Word) { int n,i; for(i=0,n=0;i<=strlen(Map);i++) { if(Map[i]!=' ') { Word[n]=Map[i]; n++; } } Word[n]='\0'; } int main() { int n,i; string Word; char Map[400]; while(gets(Map)!=NULL)//输入 { ReNode(); Turn(Map,Word); Input(Word); CoutNode(); Outnumber(number); } // Bin(2); }
06-07

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值