代码移植/升级流程中常见问题

在产品升级中,经常会有需要升级产品,修复原有BUG等情况,需要我们将原来的代码移植到全新的硬件平台上,通常来说可以重写代码或者移植代码。

在硬件型号相似,SDK变化不大的情况下,移植代码可以有效提升工作效率

但有时缺乏相对应的技巧也会浪费很多时间,反而不如重写代码。

最近移植的代码较多,下面以深圳曦华科技的Evk为例,分析从CVM0118移植到CVM0128中可能会遇到的一些问题(以Eclipse为例):

1、 SDK版本变更产生的问题

SDK版本变更可能会涉及结构体、函数名、宏定义等等问题。在使用同一公司不同版本SDK包时,这些问题大部分可以通过编译来解决,剩下的小问题再分析一下,这部分基本不会遇到什么难题。

2、芯片型号变更产生的问题

在变更芯片型号时,需要注意软硬件兼容的问题,并注意更新IDE/下载器内对应的配置。

3、环境配置问题

在移植代码时,往往是在原有代码的基础上直接进行修改,因此环境配置也会沿用先前的配置,如果忽视环境配置,可能会产生一些预期之外的问题,下面提供一些常见问题的解决思路。

3.1 ld链接文件不匹配

在修改代码后,如果没注意环境配置,仍然可能会出现问题。

当编译结束后,代码没有问题,但编译器仍可能会报ld文件错误

在这里插入图片描述

此时右键项目-Properties-C/C++ Build-Settings-GNU Arm Cross C Linker General找到链接文件路径,确认该路径下的ld链接文件与芯片相匹配。

在这里插入图片描述

修改好之后重新编译。

在这里插入图片描述
问题修复。

3.2 Debug文件缺失

在Debug时还可能会遇到如下问题。

在这里插入图片描述

这类问题是由于Settings文件不匹配产生,这里可以打开Debug Configurations来查看。

在这里插入图片描述

上图可以看出,C/C++ Application文件缺失,因此这里需要手动点击Browse来添加elf文件。

在这里插入图片描述

添加该文件后,可以正常进入Debug模式,但是这里可以明显看出问题。

在这里插入图片描述

Debug时无法自动停下,程序在进入main之前就发生了错误,这很有可能是启动代码出现了问题。

启动代码产生的原因可能有多种,例如访问错误地址,芯片型号与启动文件不匹配等等。

通常情况下,可以默认SDK没有问题。此时可以继续检查debug config的配置。

在这里插入图片描述

此时可以看出,Debug配置中的Device name与当前芯片型号不匹配,这仍然是Settings文件生成的默认配置不匹配的问题。

这里手动将Device name修改为CVM0128,并继续Debug。

在这里插入图片描述

这里可以看出,修改device name后,程序可以正常运行了。

到这里CVM0118到CVM0128的代码移植完成。

以上介绍了如何将代码移植到新的环境,并成功运行起来。

但在实际的产品开发中,代码还需要根据MCU的时钟,管脚资源,片上外设资源等实际情况调试,直至完全匹配。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,将MATLAB代码移植到嵌入式系统需要进行一些修改,如将MATLAB内置函数替换为对应的C语言库函数,将浮点数运算改为定点数运算等。以下是一个可以在嵌入式系统运行的C语言版本代码示例: ```c #include <stdio.h> #include <math.h> #define FS 1000 // 采样频率 #define FC 50 // 截止频率 #define N 5 // 滤波器阶数 // 定义滤波器系数 int b[N+1] = {0, 0, 0, 0, 0, 0}; // 分子系数 int a[N+1] = {0, 0, 0, 0, 0, 0}; // 分母系数 // 采样计数器 int sample_count = 0; // 输入缓冲区 int x[N+1] = {0, 0, 0, 0, 0, 0}; // 输出缓冲区 int y[N+1] = {0, 0, 0, 0, 0, 0}; int main() { // 计算滤波器系数 double wn = 2 * FC / FS; // 归一化截止频率 double a0 = 1 + 2 * cos(wn) + pow(cos(wn), 2); b[0] = pow(cos(wn), 2) / a0; b[1] = 2 * b[0]; b[2] = b[0]; a[0] = 1; a[1] = -2 * cos(wn) / a0; a[2] = (1 - 2 * cos(wn) + pow(cos(wn), 2)) / a0; // 模拟输入信号 int t = 0; // 时域 int f = 10; // 信号频率 int x_in = 0; // 输入信号 // 进行滤波 while (1) { // 读取输入信号 x_in = sin(2 * M_PI * f * t / FS) * pow(2, 15); // 生成10Hz的正弦波并将浮点数转换为定点数 // 更新输入缓冲区 for (int i = N; i >= 1; i--) { x[i] = x[i-1]; } x[0] = x_in; // 更新输出缓冲区 y[0] = (b[0] * x[0] + b[1] * x[1] + b[2] * x[2] - a[1] * y[1] - a[2] * y[2]) / pow(2, 15); for (int i = N; i >= 1; i--) { y[i] = y[i-1]; } // 输出结果 printf("x_in = %d, y_out = %d\n", x_in, y[0]); // 更新采样计数器 sample_count++; if (sample_count == FS) { break; } // 更新时间 t++; } return 0; } ``` 在C语言版本代码,首先定义了滤波器系数和输入输出缓冲区,并计算了滤波器系数。然后,使用一个while循环来模拟输入信号,并在每次循环对输入信号进行滤波处理,并输出结果。注意,在实际应用可能需要使用定时器来控制采样频率和采样时间。 需要注意的是,在定点数运算需要考虑数据溢出和精度损失的问题,并对算法进行优化,以提高运算速度和减少计算量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值