基于RTT压缩包C基础-不明白的接口PRF_ENV_GET __attribute__

article/2025/8/16 1:37:33

回答----https://blog.csdn.net/weixin_42381351/article/details/115524780?spm=1001.2014.3001.5501

用户APP里面 函数     struct custs1_env_tag *custs1_env = PRF_ENV_GET(CUSTS1, custs1);

这个是一个指针 分配内存 但是右边是强转的 实际上右边结构体要小呀 安不安全????

 

 


typedef uint16_t ke_task_id_t;typedef struct prf_env
{/// Application Task Number - if MSB bit set, Multi-Instantiated taskke_task_id_t app_task;/// Profile Task  Number    - if MSB bit set, Multi-Instantiated taskke_task_id_t prf_task;
} prf_env_t;//1----这是一个结构体#define BLE_NB_PROFILES          32/// Profile task environment variable definition to dynamically allocate a Task.
struct prf_task_env
{/// Profile Task description//struct ke_task_desc desc;/// pointer to the allocated memory used by profile during runtime.prf_env_t*          env;/// Profile Task Numberke_task_id_t        task;/// Profile Task Identifierke_task_id_t        id;
};/// Profile Manager environment structure
struct prf_env_tag
{/// Array of profile tasks that can be managed by Profile manager.struct prf_task_env prf[BLE_NB_PROFILES];
};struct prf_env_tag prf_env __attribute__((section("retention_mem_area0"),zero_init));prf_env_t* prf_env_get(uint16_t prf_id)
{prf_env_t* env = NULL;uint8_t i;// find if profile present in profile tasksfor(i = 0; i < BLE_NB_PROFILES ; i++){// check if profile identifier is knownif(prf_env.prf[i].id == prf_id){env = prf_env.prf[i].env;break;}}return env;
}prf_env_t tast_data = {0XAA,0XBB};
void my_init(void)
{prf_env.prf[20].id = 0x01;//  TASK_ID_CUSTS1; 假设数组中的20号是内存根源prf_env.prf[20].env = &tast_data;
}
//2----这是一个内存银行 最核心的其实是 prf_env_t*          env;它只是地址#define PRF_ENV_GET(prf_id, type) \((struct type ## _env_tag *)prf_env_get((TASK_ID_##prf_id)))/*       
struct custs1_env_tag *custs1_env = PRF_ENV_GET(CUSTS1, custs1);
也就是 
struct custs1_env_tag *custs1_env = PRF_ENV_GET(CUSTS1, custs1);= (struct custs1_env_tag *)prf_env_get(TASK_ID_CUSTS1)1---custs1_env_tag  2---TASK_ID_CUSTS1       TASK_ID_CUSTS1       = 0xFD, // Custom1 Task
*/  #define       TASK_ID_CUSTS1     0x01 
struct custs1_env_tag
{/// profile environmentprf_env_t prf_env;/// Service Start Handleuint16_t shdl;/// To store the DB max number of attributesuint8_t max_nb_att;/// On-going operationstruct ke_msg *operation;/// Cursor on connection used to notify peer devicesuint8_t cursor;/// CCC handle index, used during notification/indication busy stateuint8_t ccc_idx;
};        
static int custs1_val_ntf_req_handler(void)
{struct custs1_env_tag *custs1_env = PRF_ENV_GET(CUSTS1, custs1);//custs1_env->operation = ke_param2msg(param);custs1_env->cursor = 10;//ke_free(custs1_env->operation);custs1_env->operation = NULL;
}//3----
//struct custs1_env_tag *custs1_env = PRF_ENV_GET(CUSTS1, custs1);
//这句话终于可以分析了 它是 一个指针分配内存 而右边不是一个数组中死死的内存 是一个提前malloc的内存
//好像是左边指针比较大 右边内存比较小啊  安全吗????struct custs1_env_tag2
{uint8_t cursor;uint8_t ccc_idx;
};struct custs1_env_tag2 *custs1_env2;
uint8_t abc=3;
int main(void)
{my_init();custs1_val_ntf_req_handler();custs1_env2 = (struct custs1_env_tag2 *)&abc;custs1_env2->ccc_idx=1;custs1_env2->cursor=2;return 0;
}

可以debug看的 正常

自己测试的 也没有崩溃

 

 

 

+++++++++++++++++++++++++继续问题++++++++++++++++

快要吐血 发个抖音吧 这个问题真不不理解 在表达一次

 

发消息 

void user_svc1_accel_X_send_ntf()
    struct custs1_val_ntf_ind_req* req = KE_MSG_ALLOC_DYN(CUSTS1_VAL_NTF_REQ,                   //Message id

然后执行回调函数

static int custs1_val_ntf_req_handler(ke_msg_id_t const msgid,
    struct custs1_env_tag *custs1_env = PRF_ENV_GET(CUSTS1, custs1);
    custs1_env->operation = ke_param2msg(param);

已经明白了 参数 是req过来的  这个 ke_param2msg 不懂

 

它是修改指针的指向的 从头部修改到最后的U32 但是完全不相干啊

 

 

 

++++++再次描述一下++++

CUSTS1_VAL_NTF_REQstruct custs1_env_tag *custs1_env = PRF_ENV_GET(CUSTS1, custs1);struct custs1_env_tag
{/// profile environmentprf_env_t prf_env;/// Service Start Handleuint16_t shdl;/// To store the DB max number of attributesuint8_t max_nb_att;/// On-going operationstruct ke_msg *operation;/// Cursor on connection used to notify peer devicesuint8_t cursor;/// CCC handle index, used during notification/indication busy stateuint8_t ccc_idx;struct co_list values;/// CUSTS1 task stateke_state_t state[CUSTS1_IDX_MAX];
};
#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)))prf_env_t* prf_env_get(uint16_t prf_id)/// Profile Environment Data
typedef struct prf_env
{/// Application Task Number - if MSB bit set, Multi-Instantiated taskke_task_id_t app_task;/// Profile Task  Number    - if MSB bit set, Multi-Instantiated taskke_task_id_t prf_task;
} prf_env_t;

 

 

++++++基于RTT自己测试一下 分配小内存看看+++++


#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 taskke_task_id_t app_task;/// Profile Task  Number    - if MSB bit set, Multi-Instantiated taskke_task_id_t prf_task;
} prf_env_t;struct custs1_env_tag
{/// profile environmentprf_env_t prf_env;/// Service Start Handleint shdl;/// To store the DB max number of attributesint max_nb_att;/// On-going operationstruct ke_msg *operation;/// Cursor on connection used to notify peer devicesint cursor;/// CCC handle index, used during notification/indication busy stateint ccc_idx;};prf_env_t data __attribute__((at(0X20000100))) ={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->cursor=5;custs1_env->ccc_idx=6;return 0;
}

看上去是正常的 分配内存少一点也没有关系


http://chatgpt.dhexx.cn/article/mqrdZeyE.shtml

相关文章

Qt之pro、pri、prf、prl文件简解

pro文件 QT工程的pro文件&#xff0c;在创建工程时由QTCreater自动创建&#xff0c;我们可以往里面添加内容&#xff0c;增加库文件的声明&#xff0c;包含路径、预处理器定义&#xff0c;生成目录&#xff0c;输出中间目录等等设置。 注释: 以“#”开始&#xff0c;到这一行结…

matlab sar 斑马图,星载滑动聚束SAR卫星姿态和PRF序列设计方法与流程

本发明涉及星载合成孔径雷达系统参数设计技术领域&#xff0c;特别涉及星载滑动聚束SAR卫星系统参数设计&#xff0c;具体是一种星载滑动聚束SAR卫星姿态和PRF序列设计方法&#xff0c;可用于星载滑动聚束合成孔径雷达系统参数设计。 背景技术&#xff1a; 合成孔径雷达可以全天…

PRF 快排系统

简介&#xff1a; PRF快排系统包含WEB管理后台、刷词软件&#xff0c;二者一对N配合使用。刷词软件部分基于模拟点击原理&#xff0c;具有稳定性&#xff0c;避免因刷词带来的K站风险。 WEB管理后台&#xff1a;基于JAVA语言开发&#xff0c;MySql数据库&#xff0c;支持Window…

Efficient Batched Oblivious PRF -Private Set Intersection

论文分享&#xff01;《Efficient Batched Oblivious PRF with Applications to Private Set Intersection》--《高效批处理不经意伪随机数生成器及其在隐私集合求交中的应用》 今天介绍一篇CCS2016顶会上的文章&#xff0c;该会专注于信息安全领域实用性的论文。本文介绍的这篇…

密码学之PRP/PRF转换引理

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 本文将介绍密码学中的PRF、PRP等相关概念&#xff0c;并介绍 PRP/PRF 转换引理及其证明&#xff0c;希望读完本文后&#xf…

雷达基础知识:脉冲重复频率(PRF)

大家都知道&#xff0c;对于脉冲体制的雷达信号&#xff0c;它有一个重要的参数是脉冲重复频率(PRF)。那么&#xff0c;雷达的重频一般会有哪些变化呢&#xff1f; 重频固定 对 于常规雷达&#xff0c;PRF通常是不变的&#xff0c;也就是说脉冲重复间隔(PRI)是固定的。 示意图…

nifi入门(2)-nifi的简单使用示例

NiFi术语 为了谈论NiFi&#xff0c;用户或者是开发都应该熟悉一些nifi相关的关键术语&#xff0c;一些术语将会贯穿全文。 我们将在此重点介绍两个最重要的术语: FlowFile: 每条“用户数据”&#xff08;即&#xff0c;用户通过NiFi获取或者是生成的&#xff0c;需要进行处理和…

Apache NiFi简介

一个易用、强大、可靠的数据处理与分发系统。基于Web图形界面&#xff0c;通过拖拽、连接、配置完成基于流程的编程&#xff0c;实现数据采集等功能 一、什么是NiFi? NiFi是美国国家安全局开发并使用了8年的可视化数据集成产品&#xff0c;2014年NAS将其贡献给了Apache社区&am…

【NiFi】(一)NiFi 简介及核心概念

文章目录 一、简介二、NiFi 核心概念三、设计模型四、NiFi 架构五、NiFi 的性能期望与特点六、NiFi 功能的高级概述 一、简介 Apache NiFi 是一个易于使用、功能强大而且可靠的数据拉取、数据处理和分发系统&#xff0c;用于自动化管理系统间的数据流。它支持高度可配置的指示…

nifi从入门到实战(保姆级教程)——环境篇

背景&#xff1a; 公司领导决定将各种基础数据的导入从代码中分离出来&#xff0c;用Apache Nifi替换。使开发者们更关注在业务上&#xff0c;而不用关心基础的由来。 Apache Nifi对于整个团队都是一个全新的工具&#xff0c;之前大家都没有接触过&#xff0c;甚至是第一次听说…

1、nifi-1.9.2介绍、单机部署及简单验证

Apache NiFi系列文章 1、nifi-1.9.2介绍、单机部署及简单验证 2、NIFI应用示例-GetFile和PutFile应用 3、NIFI处理器介绍、FlowFlie常见属性、模板介绍和运行情况信息查看 4、集群部署及验证、监控及节点管理 5、NiFi FileFlow示例和NIFI模板示例 6、NIFI应用场景-离线同步Mys…

Nifi集群安装配置

机器 目录 免密登录 nifi001d /opt/software/nifi nifi001d>>nifi002d、nifi003d niif002d /opt/software/nifi nifi002d>>nifi001d、nifi003d niif002d /opt/software/nifi nifi003d>>nifi001d、nifi002d 1、安装nifi &#xff08;1&#xff…

NIFI 入门使用

1. Kettle与NIFI差异 Kettle 介绍 Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;绿色无需安装&#xff0c;数据抽取高效稳定。Kettle 中文名称叫水壶&#xff0c;该项目的主程序员MATT 希望把各种数据放到一…

《数据同步-NIFI系列》Nifi详细教程入门-06Nifi基础操作

Nifi基础操作 1 主页面 2 组 2.1 创建组 从常用功能模块&#xff0c;拖动组到画布上&#xff0c;自定义组名。可以通过鼠标移动组在画布位置。 2.2 进入、退出组 选中某一个组&#xff0c;单击右键选择enter group或者双击组进入组内&#xff0c;在组内单击右键选择leave g…

nifi-搭建

NIFI 简介 1、NIFI 的概念 1.1 起源&#xff1a;NIFI是为了自动化的处理和管理系统之间的数据流而产生的&#xff0c;基本设计概念与基于流的编程[fbp]的主要思想密切相关 1.2 nifi核心概念 FlowFile&#xff1a;FlowFile表示通过系统移动的每个对象&#xff0c;包含数据流的基…

9、NIFI综合应用场景-通过NIFI配置kafka的数据同步

Apache NiFi系列文章 1、nifi-1.9.2介绍、单机部署及简单验证 2、NIFI应用示例-GetFile和PutFile应用 3、NIFI处理器介绍、FlowFlie常见属性、模板介绍和运行情况信息查看 4、集群部署及验证、监控及节点管理 5、NiFi FileFlow示例和NIFI模板示例 6、NIFI应用场景-离线同步Mys…

Apache NiFi 入门指南

本指南使用于谁&#xff1f; 本指南适用于从未使用过&#xff0c;在NiFi中有限度接触或仅完成特定任务的用户。本指南不是详尽的说明手册或参考指南。“ 用户指南”提供了大量信息&#xff0c;旨在提供更加详尽的资源&#xff0c;并且作为参考指南非常有用。相比之下&#xff…

2、NIFI应用示例-GetFile和PutFile应用

Apache NiFi系列文章 1、nifi-1.9.2介绍、单机部署及简单验证 2、NIFI应用示例-GetFile和PutFile应用 3、NIFI处理器介绍、FlowFlie常见属性、模板介绍和运行情况信息查看 4、集群部署及验证、监控及节点管理 5、NiFi FileFlow示例和NIFI模板示例 6、NIFI应用场景-离线同步Mys…

大数据NiFi(三):NiFi关键特性

文章目录 NiFi关键特性 一、​​​​​​​​​​​​​​流管理

NiFi学习笔记

目录 NiFi概念 NiFi是什么 Apache NiFi 包括以下功能 NIFI核心概念 NiFi架构 NiFi入门 常用术语 下载安装NiFi 启动和关闭NIFI NIFI处理器 查看处理器 常用处理器 配置处理器 其他组件 应用场景 1.添加和配置第一个处理器GetFile 2.添加第二个处理器PutFile NiF…