搜索
bottom↓
回复: 13

定义在flash中的结构体指针,如何读取?上官请进

[复制链接]

出0入0汤圆

发表于 2009-9-10 15:31:17 | 显示全部楼层 |阅读模式
struct MenuItem
{
    uchar MenuCount;                                // 当前层节点数
    char DisplayString[24];                        // 菜单标题
    void (*Subs)(void);                                        // 节点函数
    struct MenuItem *ChildrenMenus; // 子节点   有子菜单就写入子菜单的结构体名,没有就赋值&Null
    struct MenuItem *ParentMenus;        // 父节点
}Null;

void NullSubs(void)
{
}
struct MenuItem MainMenu[3];
struct MenuItem SystemInformationMenu[10];
struct MenuItem DisplaySetupMenu[7];

// 结构体初始化

        struct MenuItem MainMenu[3] PROGMEM =// 将结构体定义到flash中去
        {// MenuCount        DisplayString        Subs        ChildrenMenus        ParentMenus
                {        3,        "MENU",                                                NullSubs,        NULL,                                        NULL        },
                {        3,        "<System Information>",                NullSubs,        SystemInformationMenu,        NULL        },//
                {        3,        "<Display Setup>",                        NullSubs,        DisplaySetupMenu,                NULL        },//DisplaySetupMenu
        };
case Enter://确认键,有子菜单则转入子菜单
if (MenuPoint[UserChoose].Subs != NullSubs)
{
(*MenuPoint[UserChoose].Subs)();
}
else if (MenuPoint[UserChoose].ChildrenMenus != Null)
{
MenuPoint = MenuPoint[UserChoose].ChildrenMenus;// 程序一转入子菜单,就死机了?这个地方存在flash中的结构体指针,该如何读取?
UserChoose = 0;
DisplayStart = 0;
}
问题:定义在flash中的结构体,其中的结构体指针,节点函数如何存放的?在外面如何调用?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2009-9-10 15:58:38 | 显示全部楼层
没人回啊,自己顶哈,不然就沉下去了

出0入296汤圆

发表于 2009-9-10 16:07:34 | 显示全部楼层
你用什么编译器?

出0入0汤圆

 楼主| 发表于 2009-9-10 16:10:02 | 显示全部楼层
void ShowMenu(void)
{
        uchar n;
        MaxItems = pgm_read_byte(&MenuPoint[0].MenuCount);//定义最大同级菜单
        DisplayPoint = DisplayStart;

        for( n = 0; DisplayPoint < MaxItems && n  < ShowCount; n++,DisplayPoint++)
        {
                if( DisplayPoint == UserChoose )// 光标
                {
                         // 写光标
                }
                // 写一行字符
        }
}
结构体中定义的MenuCount,DisplayString读取出来没有问题,读指针的时候就死机了?

出0入0汤圆

 楼主| 发表于 2009-9-10 16:10:19 | 显示全部楼层
gcc

出0入0汤圆

 楼主| 发表于 2009-9-10 16:10:38 | 显示全部楼层
winavr

出0入0汤圆

发表于 2009-9-10 16:17:48 | 显示全部楼层
#define pgm8(A)\
((typeof(A))pgm_read_byte(&(A)))

#define pgm16(A)\
((typeof(A))pgm_read_word(&(A)))

#define pgm32(A)\
((typeof(A))pgm_read_dword(&(A)))

读取FLASH区变量A,(A不是数组名),用pgmx(A),x=8,16,32

读取FLASH 结构体数据元素MenuPoint.Subs,用pgm16(MenuPoint.Subs)
读取FLASH 结构体数据元素MenuPoint.ChildrenMenus,用pgm16(MenuPoint.ChildrenMenusUserChoose);


if ( pgm16(MenuPoint[UserChoose].Subs) != NullSubs)
{
   if(pgm16(MenuPoint[UserChoose].Subs) != NULL)  //加上这句程序更保险一点
   {
      (* pgm16(MenuPoint[UserChoose].Subs))();
   }

}
else if ( pgm16(MenuPoint[UserChoose].ChildrenMenus) != NULL)
{
    MenuPoint = pgm16(MenuPoint[UserChoose].ChildrenMenusUserChoose);
    UserChoose = 0;
    DisplayStart = 0;
}

出0入0汤圆

发表于 2009-9-10 16:20:41 | 显示全部楼层
struct MenuItem MainMenu[3];
struct MenuItem SystemInformationMenu[10];
struct MenuItem DisplaySetupMenu[7];


定义FLASH区结构体应该加上 PROGMEM。

出0入0汤圆

 楼主| 发表于 2009-9-10 16:28:13 | 显示全部楼层
only initialized variables can be placed into program memory area
它说只有初始化变量的时候才可以指定存储器区域啊

出0入0汤圆

发表于 2009-9-10 17:04:56 | 显示全部楼层
所以定义FLASH区变量必须初始化。(GCC如此)

出0入0汤圆

 楼主| 发表于 2009-9-10 17:11:52 | 显示全部楼层
#define pgm16(A)   ((typeof(A))pgm_read_word(&(A)))
其中的typeof()有什么用啊?

出0入0汤圆

发表于 2009-9-10 17:53:18 | 显示全部楼层
typeof(A) 取变量A的类型,语法上与sizeof()类似。



char a;
typeof(a) 相当于char


int a;
typeof(a) 相当于int

typeof(a) b;
//定义一个变量b,b的类型与a相同


(typeof(a))b
//把变量b强制转换成与a相同的类型

出0入0汤圆

 楼主| 发表于 2009-9-12 16:51:22 | 显示全部楼层
多谢了,问题已经解决,能顺利从flash中读取数据了

出0入0汤圆

发表于 2010-9-24 08:28:20 | 显示全部楼层
MARK!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 02:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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