平头哥剑池CDK教程——算法工程的调试和使用

这里有我们上节二次开发完成的算法工程

需要进行调试的话首先点击工程节点下的option for xxx

我们需要保证debug level处是一个O0编译,也就是说它不去优化,这样的话能给我们带来准确的调试精度。然后点击build,以此来编译我们的算法工程

算法工程编译完成以后,我们首先需要把硬件CK-Link链接上我们的开发板,并且连到CDK中的bebug下的链接方式为ICE。

点击setting,可以看到我们的开发板已经正确链接,并且我们的开发板型号跟我们的算法工程的型号是匹配的。

然后我们这里选择点击调试按钮

可以发现我们的算法工程已经进入到了一个算法的main函数,那么我们为了调试我们的算法,需要首先讲解一下整个算法工程是怎么去跟我们之前开发的一些接口去进行配合,来实现烧写的

我们整个算法控制逻辑的核心是一个do-while的循环,在这里我们可以看到我们通过一个g_func的全局变量就可以控制每次进入循环的入口,每个入口都是我们上节所进行二次开发的接口,我们看到,对于flashprogram、flashread、flasherase这些需要参数的,那么它的待烧写的数据其实都是这个g_rwbuffer的数据空间,需要进行操作的flash地址是叫g_dstaddress的全局变量,g_length是我们需要操作的一些目标地址的长度或者buffer的长度,那么,这样的话我们整个CDK就可以通过控制我们的一些全局的变量,调用我们真正的接口去实现真正的操作。

这里我们以烧写一个目标为例,首先我们的CDK会设置我们待烧写的目标地址,比如说我们将g_dstaddress设置为flash的起始地址0x00000000

然后我们会把镜像文件中需要烧写到0x00000000起始地址的数据,会首先下载到我们的g_rwbuffer里面,然后再把g_rwbuffer的首地址以及g_rwbuffer的长度设置我们的一个全局变量,最后最关键的是我们需要把我们的g_func设置为我们flashprogram所对应的case 1。然后在这种情况下去运行我们的程序,那么我们的程序就会在进入switch case语句中去调用flashprogram的逻辑,从而实现我们将g_rwbuffer里面的数据烧写到一个具体的flash地址g_dstaddress中。

那么这里我们的程序会一直运行吗?其实不是的,我们这里关键会有一个__bkpt_label()的函数,这个函数是一个函数汇编指令。

 这里我们可以看到这个函数其实是一个执行了一个软断点,程序执行在这里的时候会始终停止,也就是说我们在运行完一次以后,程序会停在这个软断点处,那么这样的话我们就完成了一次flash的操作。

我们调试的时候,也是可以把我们之前讲的控制逻辑用我们调试的手段去模拟出来,比如说我们需要去调试flashprogram这个函数的正确性,那么我们首先需要将g_func的值配置为1,那么这里我们上节所讲到的可以在我们的watches窗口中去操作,把g_func拖动到watches窗口中去修改我们g_func的值,把他的值修改为1。

 然后我们的目标地址也是用同样的方式去修改g_dstaddress的值,比如我们希望是0地址

我们目标地址的长度g_length的设置考虑为了验证代码,所以我们可以尝试烧写比较少的字节

我们希望数组里面的数据能够去更新,这里的话我们需要去设置我们的g_rwbuffer的数组的一个值

那么首先我们需要去查看我们g_rwbuffer所在的地址,我们可以看到地址是0x20000598的首地址

我们可以看到里面的内容是全0的

我们可以把首地址的前四个字节修改成我们所希望的烧写的值

 

这样的话我们所有参数的设置就完成了,可是现在运行程序他会始终停在我们的__bkpt_label()函数,那么这样就永远也运行不到我们所设置的地址

 这里我们需要一个小的手段,我们会把general寄存器中pc的值直接设置成我们的return寄存器中,这样的话pc的值就不会指向我们的断点指令

在RV的cpu中,ra寄存器表示return地址,我们可以将ra寄存器的值复制下来,直接去赋值给我们的pc寄存器的值

我们刷新一下源代码界面,可以看到程序执行到了switch入口

然后我们在flashprogram这个函数的入口设置一个断点,我们全速运行我们的程序以后,程序就会按照我们的预期运行到我们做的二次开发里面的逻辑

我们可以看到程序的目标地址是我们设置的0

 buffer的地址是g_rwbuffer的地址

 

以及它的数据长度就是我们之前设置的4个字节

我们之前写的逻辑就会被执行,就是把我们buffer数据复制到dst地址内存中去,我们可以通过memory调试窗口去看我们0x0地址下的值是不是正确的

执行完flashprogram以后我们可以看到0x0的位置上就是我们烧写的目标值之一,这样就表示我们烧写逻辑就是成功的。

同理我们可以去更新改变g_func的值,去验证我们每一个需要进行验证的函数逻辑是否正确,这样就完成了我们整个flash接口的验证,我们调试完成以后,我们把工程配置里的compiler里的optimization配置为O2,这样的话整个flash的运行效率会提高。

 

这样的话,我们的flash工程就可以发布,我们点击open continuing folde,找到obj目录,就可以看到该elf文件就是我们的算法文件,这个算法文件可以用在我们的芯片SDK中

我们需要把我们的elf文件配置到需要烧写的solution中

由于我们的方案使用了芯片组件,那么我们需要把算法文件配置在此处

 

因此,首先我们需要把我们的算法先拷贝出来

拷贝到我们使用到芯片目录中去,可以放在根目录也可以放在芯片文件夹内任意位置即可

那么,拷贝完成以后,我们在芯片的算法文件配置中去配置我们的elf文件

 

 

我们还需要在方案里面进行配置

 我们点击flash的tag,在options for target driver有我们flash类型,我们需要勾选上program,勾选了以后才能保证CDK会进行真正的烧写操作。

verify勾选的话CDK会进行验证操作,此时会调用用我们之前说的flashchecksum接口

由于我们没有实现erase full 和erase sector相关的接口,因此我们勾选do no erase

第二个需要进行配置的点是debug,点击ICE旁边的setting

我们需要把我们download options中勾选download to flash,只有勾选了这个之后才能在启动调试的时候会使用到我们的flash算法。

完成以上配置以后我们点击启动调试,由于使用了我们配置的算法,因此将我们solution工程烧写到了指定的空间

参考视频:

https://www.bilibili.com/video/BV1gA411K7Qr?p=19&vd_source=77c874a500ef21df351103560dada737

https://www.bilibili.com/video/BV1tP411175v/?p=19&spm_id_from=pageDriver&vd_source=77c874a500ef21df351103560dada737 

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值