This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5994:使用 memcpy()将2D 阵列复制到1D 阵列不能完成执行-错误:&&&'点处中断:0x4'

Guru**** 2562120 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1060961/msp430fr5994-copying-a-2d-array-into-1d-array-does-not-complete-execution-using-memcpy---error-break-at-point-0x4

器件型号:MSP430FR5994

大家好、

我正在尝试将从2D 阵列格式的量化函数获取的数据复制到另一个1D 格式的阵列。 我将使用'mcpy()' 进行相同的操作。 当我尝试使用示例代码执行此操作时、我将指定类似大小的数据输入、量化数据、然后将其复制到一维数组中-代码工作正常、我可以在两个数组中看到相同的值。 但是、当我尝试为我在 MSP430上执行神经网络的主项目复制此代码时、memcpy 函数进入无限执行状态、我无法在调试期间跳转到下一步。 我对为什么无法在项目中复制具有所有相同参数值和数组大小的单独示例所执行的确切功能有点困惑。 我删除了代码中任何未使用或不需要的变量和行、似乎仍然会遇到相同的问题。 我能够成功执行的代码片段如下:

#include <stdio.h>
#include <msp430.h> 
#include <string.h>
#include "lib_mfcc.h"
#include <stdint.h>
#include <math.h>
#include <stdlib.h>

#define STATIC_MEMORY

#ifdef STATIC_MEMORY
    static uint8_t *nnom_static_buf = NULL;    //pointer to static buffer
    static size_t nnom_static_buf_size = 0;    //static buf size
    static size_t nnom_static_buf_curr = 0;
    void nnom_set_static_buf(void* buf, size_t size)
    {
        nnom_static_buf = buf;
        nnom_static_buf_size = size;
        nnom_static_buf_curr = 0;
    }

#endif

#ifdef STATIC_MEMORY
    uint8_t static_buf[1024];
#endif


void quantize_data(float*din, int8_t *dout, uint32_t size, uint32_t int_bit)
{
    #define _MAX(x, y) (((x) > (y)) ? (x) : (y))
    #define _MIN(x, y) (((x) < (y)) ? (x) : (y))
    float limit = (1 << int_bit);
    uint32_t i;
    float d;
    for(i=0; i<size; i++)
    {
        d= round(_MAX(_MIN(din[i], limit), -limit) / limit * 128);
        d = d/128.0f;
        dout[i] = round(d * 127);
    }
}
int main(void)
{
        WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer


#define MFCC_COEFFS (12)
#define MFCC_LEN    (62)
#define MFCC_FEAT_SIZE (MFCC_LEN * MFCC_COEFFS)

#ifdef STATIC_MEMORY
    nnom_set_static_buf(static_buf, sizeof(static_buf));
#endif

 	    float arr[12] = {11.2,34.2,54.6,7.8,9.2,3.5,22.2,59.2,17.2,1.3,23.6,28.4};
	    int8_t a[MFCC_LEN][MFCC_COEFFS];
	    uint32_t mfcc_feat_index=0;
	    quantize_data(arr,a[mfcc_feat_index],MFCC_COEFFS,3);
	    static int8_t b[744]={0};

	    memcpy(b, a, MFCC_FEAT_SIZE);
	    return 0;
}

上述代码执行成功、我能够将 A[62][12]的值复制到 b[744]中。 但是、当我在调试模式下使用此函数时、作为另一个项目的一部分使用的过程完全相同、会立即运行到无限执行状态。 我已经在这方面停留了相当一段时间,如果有任何答复,我将不胜感激。  

请告诉我是否需要任何其他信息来澄清问题、我会立即提供同样的信息。 谢谢!!

此致、

Siddhant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否尝试了 memmove()?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keith、

    很抱歉、我忘记了提到同样的问题-是的、 我根据另一篇文章中的建议尝试了 memmove,但我遇到了相同的无限执行结果-而且 memmove()在我上面发布的示例代码中工作,但在主项目中不工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以在 main()中将大量内存分配为 auto 或 static。 在分配自动变量时、编译器不会发出内存耗尽的警告。 该程序将执行意外操作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、David、

    至于数据量-我更改链接器文件的方式是使用分配给 FRAM2的空间来存储常量数据。 我要附加 cmd 链接器文件中的代码片段以供参考。 这一添加是为了响应一个构建错误而完成的、此错误表明 RAM 没有足够的空间来存储所有数据变量。 该问题是否仍会由于内存分配而出现? 我之所以提出这个问题、是因为我还在我的示例代码中分配了类似数量的存储器、并且无缝完成了执行。 如果您需要任何其他信息、请告诉我。

    #ifndef __LARGE_DATA_MODEL__
        .const            : {} > FRAM           /* Constant data                     */
    #else
        .const            : {} >> FRAM2		  /* Constant data                     */
    #endif
    
    #ifndef __LARGE_CODE_MODEL__
        .text             : {} > FRAM           /* Code                              */
    #else
        .text             : {} >> FRAM		  /* Code                              */
    #endif
    

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    根据 David 的建议、您可能需要将阵列定义设置为全局变量、因此它们不会在栈上分配。 我认为编译器在这些情况下足够智能地使用 malloc(),但它是值得尝试的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David 和 Keith、非常感谢! 将数组声明为全局值是成功的!! 我现在将关闭此问题! 再次感谢!