查看: 7617|回复: 21

[其他] C语言功底检测,看看这句话能否看懂?高手云集

[复制链接]

该用户从未签到

7

主题

66

帖子

0

注册会员

Rank: 2

积分
155
最后登录
2020-12-15
发表于 2012-12-6 09:46:28 | 显示全部楼层 |阅读模式
各位前辈麻烦看帮我分析下这句话具体代表什么意思:pFLASHPROGRAM  pFlashProgram  = (pFLASHPROGRAM)  FlashProgram_C;
下面是提供的相应材料。
const unsigned long FlashProgram_C[] =
{
       0x9421FFA0, 0x7C0802A6, 0x90010064, 0xBE61002C, 0x7C000026
    , 0x90010028, 0x7C7F1B78, 0x7C9D2378, 0x7CBB2B78, 0x7CD73378
    , 0x7CF63B78, 0x3B400008, 0x3B200000, 0x83DF0000, 0x7FB5DB78
    , 0x829F0020, 0x7E75A396, 0x7E93A1D6, 0x7E94A850, 0x2E140000
    , 0x40920010, 0x56F407BE, 0x2E140000, 0x4192000C, 0x3B200100
    , 0x480002B8, 0x829F000C, 0x82BF0010, 0x7E94AA14, 0x92810014
    , 0x829F0004, 0x82BF0008, 0x7E94AA14, 0x92810010, 0x7F9DDA14
    , 0x829F000C, 0x7E1DA040, 0x41900034, 0x82810014, 0x7E1DA040
    , 0x40900028, 0x829F0010, 0x7E1BA040, 0x4191001C, 0x82810014
    , 0x7E1CA040, 0x41910010, 0x3A600001, 0x9A610008, 0x48000048
    , 0x829F0004, 0x7E1DA040, 0x41900034, 0x82810010, 0x7E1DA040
    , 0x40900028, 0x829F0008, 0x7E1BA040, 0x4191001C, 0x82810010
    , 0x7E1CA040, 0x41910010, 0x3A600002, 0x9A610008, 0x4800000C
    , 0x3B200200, 0x48000214, 0x2E1B0000, 0x4192020C, 0x829E0000
    , 0x92810018, 0x82810018, 0x72940016, 0x2E140000, 0x4192000C
    , 0x3B200300, 0x480001EC, 0x829E0000, 0x62940010, 0x5694049E
    , 0x929E0000, 0x829F0020, 0x2A140020, 0x40920014, 0x577CD97E
    , 0x3B400020, 0x3B000008, 0x48000054, 0x829F0020, 0x2A140010
    , 0x40920014, 0x577CE13E, 0x3B400010, 0x3B000008, 0x48000038
    , 0x829F0020, 0x2A140008, 0x40920014, 0x577CE8FE, 0x3B400008
    , 0x3B000008, 0x4800001C, 0x829F0020, 0x2A140004, 0x40920010
    , 0x577CF0BE, 0x3B400004, 0x3B000004, 0x3A600001, 0x9261001C
    , 0x480000D0, 0x2A1A0004, 0x40910018, 0x82B70000, 0x82970004
    , 0x929D0004, 0x92BD0000, 0x4800000C, 0x82970000, 0x929D0000
    , 0x7FBDC214, 0x7EF7C214, 0x7E9DD396, 0x7E94D1D6, 0x7E94E850
    , 0x2E140000, 0x41920010, 0x8281001C, 0x7E14E040, 0x40920078
    , 0x829E0000, 0x62940001, 0x5694049E, 0x929E0000, 0x4800001C
    , 0x3A60FFFF, 0x7E169840, 0x41920010, 0x7ECCB378, 0x7D8903A6
    , 0x4E800421, 0x829E0000, 0x5694056A, 0x2E140000, 0x4192FFDC
    , 0x829E0000, 0x569405AC, 0x2E140000, 0x4092001C, 0x827E0000
    , 0x5673003C, 0x5673049E, 0x927E0000, 0x3B200400, 0x4800002C
    , 0x829E0000, 0x5694003C, 0x5694049E, 0x929E0000, 0x8281001C
    , 0x3A940001, 0x9281001C, 0x8281001C, 0x7E14E040, 0x4091FF2C
    , 0x827E0000, 0x56730734, 0x5673049E, 0x927E0000, 0x827F0000
    , 0x3E733C08, 0x2A13C000, 0x41920030, 0x3E60C3F9, 0x8273801C
    , 0x9261000C, 0x3E60C3F9, 0x8273801C, 0x5674003C, 0x3E60C3F9
    , 0x9293801C, 0x8281000C, 0x3E60C3F9, 0x9293801C, 0x827F0000
    , 0x3E733C08, 0x2A13C000, 0x40920030, 0x3E60C3F9, 0x82738020
    , 0x9261000C, 0x3E60C3F9, 0x82738020, 0x5674003C, 0x3E60C3F9
    , 0x92938020, 0x8281000C, 0x3E60C3F9, 0x92938020, 0x827F0024
    , 0x2E130000, 0x41920008, 0x00000000, 0x7F23CB78, 0x81810028
    , 0x7D8FF120, 0xBA61002C, 0x80010064, 0x7C0803A6, 0x38210060
    , 0x4E800020
    , 0x30393530, 0x34464646
};
typedef struct _ssd_config
{
    uint32_t c90flRegBase;           /* C90FL control register base */
    uint32_t mainArrayBase;        /* base of main array */
    uint32_t mainArraySize;        /* size of main array */
    uint32_t shadowRowBase;        /* base of shadow row */
    uint32_t shadowRowSize;        /* size of shadow row */
    uint32_t lowBlockNum;          /* block number in low address space */
    uint32_t midBlockNum;          /* block number in middle address space */
    uint32_t highBlockNum;         /* block number in high address space */
    uint32_t pageSize;            /* page size */
    uint32_t BDMEnable;            /* debug mode selection */
}*PSSD_CONFIG;
typedef uint32_t (*pFLASHPROGRAM) (
                PSSD_CONFIG pSSDConfig,
                uint32_t dest,
                uint32_t size,
                uint32_t source,
                void (*CallBack)(void)
               );
我知道答案 目前已有21人回答
回复

使用道具 举报

该用户从未签到

11

主题

288

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
610
最后登录
1970-1-1
发表于 2012-12-6 14:55:08 | 显示全部楼层

RE:C语言功底检测,看看这句话能否看懂?高手云集

从代码的定义和结构体的定义可以推测,这段代码是一段内嵌类似与bootloader的程序。通过这样定义,可以将程序固定到某段空间。这样实现应用程序和bootloader程序整合为一个程序。
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

66

帖子

0

注册会员

Rank: 2

积分
155
最后登录
2020-12-15
 楼主| 发表于 2012-12-6 16:28:03 | 显示全部楼层

回复:C语言功底检测,看看这句话能否看懂?高手云集

回复第 2 楼 于2012-12-06 14:55:08发表:
从代码的定义和结构体的定义可以推测,这段代码是一段内嵌类似与bootloader的程序。通过这样定义,可以将程序固定到某段空间。这样实现应用程序和bootloader程序整合为一个程序。 

嗯,版主说的很对。程序是固定在哪段空间呢?FlashProgram_C这个数组的起始地址吗?那这个数组里的内容又是什么呢,只是单纯的数据吗?谢谢。
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

288

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
610
最后登录
1970-1-1
发表于 2012-12-6 16:53:40 | 显示全部楼层

RE:C语言功底检测,看看这句话能否看懂?高手云集

这段数据内容是一个bootloader的程序代码,也就是烧写文件转换为实际的地址。你看一下CONST试用的是哪个区域,或者可以用const unsigned long FlashProgram_C[] @addr={};来实现定义到具体的地址。
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

66

帖子

0

注册会员

Rank: 2

积分
155
最后登录
2020-12-15
 楼主| 发表于 2012-12-6 17:29:12 | 显示全部楼层

回复:C语言功底检测,看看这句话能否看懂?高手云集

回复第 4 楼 于2012-12-06 16:53:40发表:
这段数据内容是一个bootloader的程序代码,也就是烧写文件转换为实际的地址。你看一下CONST试用的是哪个区域,或者可以用const unsigned long FlashProgram_C[] @addr={};来实现定义到具体的地址。 

版主真是厉害啊。哈哈...我目前用的编译环境不支持“@”这个标示符,但是我调试的时候看到这个FlashProgram_C数组起始地址是随着整个工程程序的改动而变化的。这样是否意味着这个bootloader程序起始地址也是变动的呢?
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

99

帖子

0

中级会员

Rank: 3Rank: 3

积分
322
最后登录
1970-1-1
发表于 2012-12-6 21:28:56 | 显示全部楼层

回复:C语言功底检测,看看这句话能否看懂?高手云集

回复第 5 楼 于2012-12-06 17:29:12发表:
回复第 4 楼 于2012-12-06 16:53:40发表:
这段数据内容是一个bootloader的程序代码,也就是烧写文件转换为实际的地址。你看一下CONST试用的是哪个区域,或者可以用const unsigned long FlashProgram_C[] @addr={};来实现定义到具体的地址。 

版主真是厉害啊。哈哈...我目前用的编译环境不支持“@”这个标示符,但是我调试的时候看到这个FlashProgram_C数组起始地址是随着整个工程程序的改动而变化的。这样是否意味着这个bootloader程序起始地址也是变动的呢?
 

启示地址决定于linker 的定义。各个编译器都不同,比如有的CodeWarrior版本把联接定义放在.lcf文件中。你的FlashProgram_C数组起始地址随着整个工程程序的改动而变化,那联接定义里一定是把这个数组排在别的模块后边了;别的模块大小改变,结束地址就改变,因此这个FlashProgram_C数组起始地址也跟着改变。
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

288

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
610
最后登录
1970-1-1
发表于 2012-12-7 09:50:22 | 显示全部楼层

RE:C语言功底检测,看看这句话能否看懂?高手云集

修改CONST定义的范围,或者用该编译器的#program code 之类的代码进行位置的固定。
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

66

帖子

0

注册会员

Rank: 2

积分
155
最后登录
2020-12-15
 楼主| 发表于 2012-12-7 12:27:34 | 显示全部楼层

回复:C语言功底检测,看看这句话能否看懂?高手云集

回复第 7 楼 于2012-12-07 09:50:22发表:
修改CONST定义的范围,或者用该编译器的#program code 之类的代码进行位置的固定。 

谢谢版主提示,我试过这种方法,通过.map文件可以看到数组存放位置的确在我分段固定的flash地址,但是初始化的数据并未在相应地址中,该flash地址中的数据仍然是缺省值。版主有什么解决办法,使存放在flash固定地址中的数组初始化值也放在该地址中呢?
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

66

帖子

0

注册会员

Rank: 2

积分
155
最后登录
2020-12-15
 楼主| 发表于 2012-12-7 12:41:03 | 显示全部楼层

回复:C语言功底检测,看看这句话能否看懂?高手云集

回复第 6 楼 于2012-12-06 21:28:56发表:
回复第 5 楼 于2012-12-06 17:29:12发表:
回复第 4 楼 于2012-12-06 16:53:40发表:
这段数据内容是一个bootloader的程序代码,也就是烧写文件转换为实际的地址。你看一下CONST试用的是哪个区域,或者可以用const unsigned long FlashProgram_C[] @addr={};来实现定义到具体的地址。 

版主真是厉害啊。哈哈...我目前用的编译环境不支持“@”这个标示符,但是我调试的时候看到这个FlashProgram_C数组起始地址是随着整个工程程序的改动而变化的。这样是否意味着这个bootloader程序起始地址也是变动的呢?
 

启示地址决定于linker 的定义。各个编译器都不同,比如有的CodeWarrior版本把联接定义放在.lcf文件中。你的FlashProgram_C数组起始地址随着整个工程程序的改动而变化,那联接定义里一定是把这个数组排在别的模块后边了;别的模块大小改变,结束地址就改变,因此这个FlashProgram_C数组起始地址也跟着改变。
 

嗯,lwn71说的对,我用的编译器链接文件格式是.lcf。由于我没有给FlashProgram_C分配在固定地址,所以他的起始地址由编译器自动给定。但是我若给这个数组分配在code flash的后段地址(即暂未用到的flash地址)的话,FlashProgram_C数组中初始化值将丢失,写入不了flash地址。lwn71有何解决方案吗?
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

99

帖子

0

中级会员

Rank: 3Rank: 3

积分
322
最后登录
1970-1-1
发表于 2012-12-7 21:32:08 | 显示全部楼层

回复:C语言功底检测,看看这句话能否看懂?高手云集

回复第 9 楼 于2012-12-07 12:41:03发表:
回复第 6 楼 于2012-12-06 21:28:56发表:
回复第 5 楼 于2012-12-06 17:29:12发表:
回复第 4 楼 于2012-12-06 16:53:40发表:
 


嗯,lwn71说的对,我用的编译器链接文件格式是.lcf。由于我没有给FlashProgram_C分配在固定地址,所以他的起始地址由编译器自动给定。但是我若给这个数组分配在code flash的后段地址(即暂未用到的flash地址)的话,FlashProgram_C数组中初始化值将丢失,写入不了flash地址。lwn71有何解决方案吗?
 

我不太明白您这句话的意思“但是我若给这个数组分配在code flash的后段地址(即暂未用到的flash地址)的话,FlashProgram_C数组中初始化值将丢失,写入不了flash地址”。是指如果把数据分配在flash的后段地址,编译器不让您带初始化数据吗?那可能是编译器的问题了
 
如果只想把FlashProgram_C数组固定在code flash的某个地址,问题就简单了,而且有多种方法。一个办法就是用上边提到的const并给出具体地址, 如const unsigned long FlashProgram_C[size] @ 0x00005000。另外在.lcf里在MEMORY那段你要把code等等的地址范围和你的FlashProgram_C地址段错开,否则有些(版本的)编译器会把code覆盖到FlashProgram_C上,您就会看到象您说的初始化值丢失。
 
因为不知道您用那款芯片和那个编译器,我不确认我方法对您有效。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-22 12:13 , Processed in 0.104616 second(s), 30 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表