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.

关于MSP430程序编写软件—CCSV5 为变量分配内存问题



你们好,前段时间用430写一个稍复杂的程序时遇到一些变量内存的分配上的一些问题。我用的软件是TI的CCSV5,硬件是MPS430F5438A。具体情况如下:

    如上图示,在一个函数中我定义了一个unsigned long型的变量temp,但它的位置是Register R12,R12的长度应该只有24位,似乎不大对吧。如何把变量直接定义在某个地址上,而不是寄存器。

    此外似乎无法对变量temp进行赋值,如:

temp=0;
temp++;

   执行先上面条语句后,temp居然等于0x00005A73!如下图示:

    还有一次我用结构体指针作为函数参数成员进行传值,对此指针地址不做任何改变的情况下,在最后跳出此函数时该结构体指针所指向的地址居然突然变化为另一个无关的值,真是难以理解!

    问题有点多,希望给予解惑,谢谢!

  • 麻烦楼主把能够重现问题最小子集的代码贴出来。

  • 主要函数如下:UINT32 定义为 unsigned long ,此函数大部分与temp变量无直接关系,但删除后不能体现问题,故全贴在下面望见谅。

    UINT8 FindSameExtensionFile (char *Extension, struct FileInfo *FiInfo)
    {
    UINT8 flag;
    UINT16 i,j,k;
    UINT32 temp;
    //
    for(flag=0,j=0;flag<4;flag++)
    {
    if((SD_Read_Sector(pArg->FirstDirSector,FAT32_Buffer))!=0) return 0xff;
    for(i = 0; i < 16; i++)
    {
    if(FAT32_Buffer[i*32]==0xE5) continue;//此文件损坏
    if((FAT32_Buffer[i*32]==0)&&(FAT32_Buffer[i*32+32]==0)) {flag=4;break;}//搜索完毕
    for(k = 0; k < 3; k++)//判断文件拓展名
    {
    if(FAT32_Buffer[i*32+8+k] != Extension[k]) break;//不符合要求
    }
    if(FAT32_Buffer[i*32+8+k-1] != Extension[k-1]) continue;
    for(k = 0; k < 8; k++)//文件名
    {
    FiInfo[j].FiName[k] = FAT32_Buffer[i*32+k];
    }
    // 开始簇
    temp=0;
    temp++;////////////////////////////////////////////////////////////////////运行到此,查看变量值如下截图///////////////////////////////////////////////////////////////////////////////
    //temp= ((UINT32)FAT32_Buffer[i*32+0x15]<<24)+((UINT32)FAT32_Buffer[i*32+0x14]<<16)+((UINT32)FAT32_Buffer[i*32+0x1b]<<8)+FAT32_Buffer[i*32+0x1a];
    //开始扇区
    FiInfo[j].FirSector=(temp-2)*(pArg->SectorsPerClust)+pArg->FirstDirSector;
    // 文件大小,单位字节
    temp= ((UINT32)FAT32_Buffer[i*32+0x1f]<<24)+((UINT32)FAT32_Buffer[i*32+0x1e]<<16)+((UINT32)FAT32_Buffer[i*32+0x1d]<<8)+FAT32_Buffer[i*32+0x1c];
    FiInfo[j].FileSize = temp;
    j++;
    if(j == FileNum) {flag=4;break;}
    }
    if(flag==4) break;
    }
    return j;
    }