C基础问题-内存被踩-为啥dialog坚持-明白了

还是前面问题 https://blog.csdn.net/weixin_42381351/article/details/115466251?spm=1001.2014.3001.5502

现在自己设计一下   左边大 右边小 强转以后 继续操作左边


#define      ke_task_id_t   int
#define      TASK_ID_CUSTS1 11
 /// Profile Environment Data
typedef struct prf_env
{
    /// Application Task Number - if MSB bit set, Multi-Instantiated task
    ke_task_id_t app_task;
    /// Profile Task  Number    - if MSB bit set, Multi-Instantiated task
    ke_task_id_t prf_task;
} prf_env_t;
    
struct custs1_env_tag
{
    /// profile environment
    prf_env_t prf_env;
    /// Service Start Handle
    int shdl;
    /// To store the DB max number of attributes
    int max_nb_att;
    /// On-going operation
    struct ke_msg *operation;
    /// Cursor on connection used to notify peer devices
    int cursor;
    /// CCC handle index, used during notification/indication busy state
    int ccc_idx;

};

prf_env_t data  __attribute__((at(0X20000100))) ={1,2} ;
prf_env_t data2 __attribute__((at(0X20000108))) ={1,2} ;
prf_env_t* prf_env_get(uint16_t prf_id)
{
 // static prf_env_t data={1,2};
  return &data;
}

#define PRF_ENV_GET(prf_id, type) \
        ((struct type ## _env_tag *)prf_env_get((TASK_ID_##prf_id)))
// ((struct custs1_env_tag *)prf_env_get((TASK_ID_CUSTS1)))
 
int main(void)
{
    struct custs1_env_tag *custs1_env = PRF_ENV_GET(CUSTS1, custs1);
    custs1_env->shdl=8;
    custs1_env->cursor=5;
    custs1_env->ccc_idx=6;
    rt_kprintf("---%x--%d---\n",&custs1_env->cursor,custs1_env->cursor);
    return 0;
}

 

 

 

 

 

看这个更简单一点 百分比踩踏

#define SHOWME  rt_kprintf("---%s--%d---\n",__FUNCTION__,__LINE__);

#define      ke_task_id_t   int
#define      TASK_ID_CUSTS1 11
 /// Profile Environment Data
typedef struct prf_env
{
    /// Application Task Number - if MSB bit set, Multi-Instantiated task
    ke_task_id_t app_task;
    /// Profile Task  Number    - if MSB bit set, Multi-Instantiated task
    ke_task_id_t prf_task;
} prf_env_t;
    
struct custs1_env_tag
{
    /// profile environment
    prf_env_t prf_env;
    /// Service Start Handle
    int shdl;
    /// To store the DB max number of attributes
    int max_nb_att;
    /// On-going operation
    struct ke_msg *operation;
    /// Cursor on connection used to notify peer devices
    int cursor;
    /// CCC handle index, used during notification/indication busy state
    int ccc_idx;

};

//prf_env_t data  __attribute__((at(0X20000100))) ={1,2} ;
//prf_env_t data2 __attribute__((at(0X20000108))) ={1,2} ;

prf_env_t data[10] ={{1,2}} ;
prf_env_t* prf_env_get(uint16_t prf_id)
{
 // static prf_env_t data={1,2};
  return &data[0];
}

#define PRF_ENV_GET(prf_id, type) \
        ((struct type ## _env_tag *)prf_env_get((TASK_ID_##prf_id)))
// ((struct custs1_env_tag *)prf_env_get((TASK_ID_CUSTS1)))
 
int main(void)
{
    struct custs1_env_tag *custs1_env = PRF_ENV_GET(CUSTS1, custs1);
    custs1_env->shdl=8;
    custs1_env->cursor=5;
    custs1_env->ccc_idx=6;
    rt_kprintf("---%x--%d---\n",&custs1_env->cursor,custs1_env->cursor);
    return 0;
}

 

 

 

 

 

+++++++++++++++++++++更加高仿一次 C的基础 里面有指针的话 内存不是线性的了 是往下走到指针这里 横着跟着指针走了

认证看


typedef uint16_t ke_task_id_t;

typedef struct prf_env
{
    /// Application Task Number - if MSB bit set, Multi-Instantiated task
    ke_task_id_t app_task;
    /// Profile Task  Number    - if MSB bit set, Multi-Instantiated task
    ke_task_id_t prf_task;
} prf_env_t;



struct prf_task_env
{
    /// Profile Task description
    //struct ke_task_desc desc;
    ke_task_id_t        desc;//假装测试一下
    /// pointer to the allocated memory used by profile during runtime.
    prf_env_t*          env;
    /// Profile Task Number
    ke_task_id_t        task;
    /// Profile Task Identifier
    ke_task_id_t        id;
};

struct prf_env_tag
{
    /// Array of profile tasks that can be managed by Profile manager.
    struct prf_task_env prf[30];
};

//struct prf_env_tag prf_env __attribute__((section("retention_mem_area0"),zero_init));
struct prf_env_tag prf_env;//假装测试一下

prf_env_t* prf_env_get(uint16_t prf_id)
{
    prf_env_t* env = prf_env.prf[prf_id].env;
    return env;
}
prf_env_t data={8,9};
int main(void)
{
    uint16_t prf_id = 0;
    
    struct custs1_env_tag
    {
    /// profile environment
    prf_env_t prf_env;
    /// Service Start Handle
    uint16_t shdl;
    /// To store the DB max number of attributes
    uint8_t max_nb_att;
    };
    
    prf_env.prf[prf_id].desc=1;
    prf_env.prf[prf_id].env=&data;
    prf_env.prf[prf_id].task=2;
    prf_env.prf[prf_id].id=3;
    struct custs1_env_tag *custs1_env = (struct custs1_env_tag *)prf_env_get(0);
    

    custs1_env->shdl = 11;
    custs1_env->max_nb_att = 12;
    return 0;
}

结论是 维持之前的理解 小内存分出去的 有风险

 

写道这里 好像突然有点感悟了 既然内存在结构体内部跟着指针走了

我上面的关键就是给出去的prf_env_t data={8,9};的内存 如果它本来就很大呢》那就安全了

 

static uint8_t diss_init (struct prf_task_env* env, uint16_t* start_hdl, uint16_t app_task, uint8_t sec_lvl,  struct diss_db_cfg* params)
{

        // allocate DISS required environment variable
        env->env = (prf_env_t*) diss_env;

 

 

 

static uint8_t custs1_init(struct prf_task_env *env, uint16_t *start_hdl, uint16_t app_task, uint8_t sec_lvl, struct custs1_db_cfg *params)
{

    struct custs1_env_tag *custs1_env = (struct custs1_env_tag *) ke_malloc(sizeof(struct custs1_env_tag), KE_MEM_ATT_DB);

    // allocate CUSTS1 required environment variable
    env->env = (prf_env_t *)custs1_env;

 

 

我在类似上面的这个地方 找到了!!!!!

哈哈 原来是这样啊  给的内存果然是比较大啊

而且转来转去 还是当初的那个结构体

 

 

 

 

 

所以我的测试代码 下面就是dialog的逻辑 转来转去

typedef uint16_t ke_task_id_t;

typedef struct prf_env
{
    /// Application Task Number - if MSB bit set, Multi-Instantiated task
    ke_task_id_t app_task;
    /// Profile Task  Number    - if MSB bit set, Multi-Instantiated task
    ke_task_id_t prf_task;
} prf_env_t;



struct prf_task_env
{
    /// Profile Task description
    //struct ke_task_desc desc;
    ke_task_id_t        desc;//假装测试一下
    /// pointer to the allocated memory used by profile during runtime.
    prf_env_t*          env;
    /// Profile Task Number
    ke_task_id_t        task;
    /// Profile Task Identifier
    ke_task_id_t        id;
};

struct prf_env_tag
{
    /// Array of profile tasks that can be managed by Profile manager.
    struct prf_task_env prf[30];
};

//struct prf_env_tag prf_env __attribute__((section("retention_mem_area0"),zero_init));
struct prf_env_tag prf_env;//假装测试一下

prf_env_t* prf_env_get(uint16_t prf_id)
{
    prf_env_t* env = prf_env.prf[prf_id].env;
    return env;
}

struct custs1_env_tag
{
/// profile environment
prf_env_t prf_env;
/// Service Start Handle
uint16_t shdl;
/// To store the DB max number of attributes
uint8_t max_nb_att;
};
struct custs1_env_tag data={{8,9},7,6};
//prf_env_t data={8,9};
int main(void)
{
    uint16_t prf_id = 0;
    
    prf_env.prf[prf_id].env=(prf_env_t* )&data;

    struct custs1_env_tag *custs1_env = (struct custs1_env_tag *)prf_env_get(prf_id);
    
    custs1_env->shdl = 11;
    custs1_env->max_nb_att = 12;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值