基于Renode调试OneOS-Lite物联网操作系统

前言

我们已经使用renode仿真开发OneOS-Lite物联网操作系统,并使用模拟出的串口,输出了Hello OneOS-Lite。而想要更深入地了解系统的执行流程,或者解决程序的bug,拥有调试的手段,必不可少!

本篇文章将从调试的角度出发,基于Renode,使用gdb调试OneOS-Lite物联网操作系统。通过调试OneOS-Lite,也可以更加直白地了解她。

renode调试支持

Renode支持使用 GDB 调试在仿真机器上运行的应用程序。

它使用 GDB 远程协议,并支持使用最常见的 GDB 函数,如断点,观察点,单步,内存访问等。

在真实硬件上调试最重要的区别是:当仿真的CPU停止时,虚拟时间不会进展。这使得调试过程对于仿真机器来说是透明的。

编译程序

首先,当然是编译程序,这里我们使用的是OneOS-Lite下的STM32F407VG-renode项目,进入该项目中,编译生成elf文件。
建议克隆源码仓库https://gitee.com/cmcc-oneos/OneOS-Lite,体验尝试。

创建仿真

在文章《使用renode仿真开发OneOS-Lite物联网操作系统》,我们已经实战操作过如何进行仿真的全过程。为了简化操作,我们已经把步骤写成了脚本文件stm32f4_discovery.resc,放在STM32F407VG-renode项目中。

使用以下命令:

include @D:\gitee\OneOS-Lite\projects\STM32F407VG-renode\stm32f4_discovery.resc

连接gdb

在renode监视器中运行以下指令,我们可以在端口 3333 上启动 GDB 服务器:

(machine-0) machine StartGdbServer 3333

我们可以自行选择适当的工具链启动 GDB,并连接到远程目标(这里我们选择的是CUBE工具自带的GDB调试程序):

$ arm-none-eabi-gdb /path/to/application.elf
(gdb) target remote :3333

在elf程序的目录下,执行以上命令(这样可以免除路径的烦恼):

开始调试

GDB 连接到renode后,仿真就可以开始了。仅仅告诉 GDB 继续,并不足以启动程序,这是我们还要告诉renode监视器,才能得以调试继续。

(gdb) monitor start
(gdb) continue

在此之后,我们就可以像正常使用gdb调试程序的样子,单步、断点、查看栈层次等等。

关注&&联系

gitee: https://gitee.com/cmcc-oneos/OneOS-Lite

docs: https://oneos-lite.com/

公众号:CMCC-OneOS

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值