移植某开源代码到嵌入式板子上的一点经验

1. 代码编译问题

先要把代码拷贝到板子上的项目里一块进行编译,往往遇到编译或者链接不过

很常见的是,libc不兼容

比如板子上都没有文件系统, 所有的文件系统相关函数都要重新实现,最开始是注释掉所有带open,close, read, write, fputc, fgetc, print, lstat, fstat等函数

还有assert.h也没有, 需要把相关的assert函数注释掉

还有abort, kill, exit, getpid等函数

还有函数重复定义, 有的需要去掉相同部分的或者重命名的函数

2. 代码size太大,超过了ROM或者RAM size 

需要裁剪代码, 或者增大ROM/RAM(同时要修改memory map)

3. 内存泄漏问题

在板子调试这个问题好麻烦, 光看日志或者只看代码很难解决,就看有没有好工具。 或者到x86用asan或其他工具调试。

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

余额充值