想把代码写的更可配置一些,尝试指针函数,在用 sizeof 的时候遇到些问题贴出来给大家分享
* 示例函数
- void dosomething(void) {
- static int i=0;
- i=i+1;
- }
复制代码
* 示例指针函数数组
- void (*p_array[])(void) = {
- dosomething,
- dosomething,
- dosomething,
- dosomething,
- dosomething,
- dosomething,
- dosomething,
- dosomething,
- dosomething,
- dosomething,
- };
复制代码
*出错的调用函数
- int main(void)
- {
- for(array_size = 0;array_size < sizeof(p_array)/sizeof(int);array_size++) {
- (*p_array[array_size])();
- }
- while(1);
- }
复制代码
*跑通的用法
- int main(void)
- {
- for(array_size = 0;array_size < sizeof(p_array)/sizeof(p_array[0]);array_size++) {
- (*p_array[array_size])();
- }
- while(1);
- }
复制代码
错误分析,我想当然的以为 void (*p_array[])(void) 每个元素的长度是两位。结果跑飞了
正确的在这里:
- stmt level source
- 1 int *p1; /* generic ptr (3 bytes) */
- 2 int xdata *p2; /* xdata ptr (2 bytes) */
- 3 int idata *p3; /* idata ptr (1 byte) */
- 4 int code *p4; /* code ptr (2 bytes */
- 5
- 6 void pconvert (void) {
- 7 1 p1 = p2; /* xdata* to generic* */
- 8 1 p1 = p3; /* idata* to generic* */
- 9 1 p1 = p4; /* code* to generic* */
- 10 1
- 11 1 p4 = p1; /* generic* to code* */
- 12 1 p3 = p1; /* generic* to idata* */
- 13 1 p2 = p1; /* generic* to xdata* */
- 14 1
- 15 1 p2 = p3; /* idata* to xdata* (WARN) */
- *** WARNING 259 IN LINE 15 OF P.C: pointer: different mspace
- 16 1 p3 = p4; /* code* to idata* (WARN) */
- *** WARNING 259 IN LINE 16 OF P.C: pointer: different mspace
- 17 1 }
- ASSEMBLY LISTING OF GENERATED OBJECT CODE
- ; FUNCTION pconvert (BEGIN)
- ; SOURCE LINE # 7
- 0000 750001 R MOV p1,#01H
- 0003 850000 R MOV p1+01H,p2
- 0006 850000 R MOV p1+02H,p2+01H
- ; SOURCE LINE # 8
- 0009 750000 R MOV p1,#00H
- 000C 750000 R MOV p1+01H,#00H
- 000F 850000 R MOV p1+02H,p3
- ; SOURCE LINE # 9
- 0012 7B05 MOV R3,#0FFH
- 0014 AA00 R MOV R2,p4
- 0016 A900 R MOV R1,p4+01H
- 0018 8B00 R MOV p1,R3
- 001A 8A00 R MOV p1+01H,R2
- 001C 8900 R MOV p1+02H,R1
- ; SOURCE LINE # 11
- 001E AE02 MOV R6,AR2
- 0020 AF01 MOV R7,AR1
- 0022 8E00 R MOV p4,R6
- 0024 8F00 R MOV p4+01H,R7
- ; SOURCE LINE # 12
- 0026 AF01 MOV R7,AR1
- 0028 8F00 R MOV p3,R7
- ; SOURCE LINE # 13
- 002A AE02 MOV R6,AR2
- 002C 8E00 R MOV p2,R6
- 002E 8F00 R MOV p2+01H,R7
- ; SOURCE LINE # 15
- 0030 750000 R MOV p2,#00H
- 0033 8F00 R MOV p2+01H,R7
- ; SOURCE LINE # 16
- 0035 850000 R MOV p3,p4+01H
- ; SOURCE LINE # 17
- 0038 22 RET
- ; FUNCTION pconvert (END)
复制代码
参考链接:
http://www.keil.com/support/man/docs/c51/c51_le_ptrconversions.htm
另外还在软件仿真的时候,遇到 *** error 65: access violation at : no 'execute/read' permission
参考:
http://blog.csdn.net/bobbat/article/details/41059721 的2条
2.仿真出现*** error 65: access violation at 0x0000000C : no 'read' permission的错误是因为没有相应的内存映射,可能的原因是由于软件仿真没有分配相应的映射地址。如果想要避开这个错误,可以再keil软件的仿真状态下面点击菜单栏的Debug-》Memory Map,如下图添加缺少的内存映射值范围,如0x0000000c在0x00000000-0x0000000f之间。如下图:
20141113003449517.png (23.69 KB, 下载次数: 0)
下载附件
2018-2-13 12:10 上传
然后点击Map Range,最后close即可。在Run就没有错误了。
all;
一周热门 更多>