还是前面问题 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;
}