CCS中静态库lib的生成与调用

  在调试DSP设备的时候,发现好多工程会把比较核心的代码生成静态库lib,代码运行的时候直接调用lib里面的相关函数就行。但是从外部是看不到lib库里面的内容的,这样通过静态库的方式实现对代码的加密。

  在网上找了好久如何将函数生成静态库*.lib的方法,找到的资料都比较零散,看起来比较费劲,通过自己的摸索,终于验证成功了。下面将我的方法分享一下。

  下面用到的相关工程全部已打包上传 https://download.csdn.net/download/qq_20222919/88583858

   首先调试好需要生成lib库文件的工程,这里使用一个流水灯来演示。
在这里插入图片描述

   main函数中调用流水灯函数,实现LED灯的各种显示效果。
在这里插入图片描述

   leds.c文件中主要对LED灯使用到的端口进行初始化。
在这里插入图片描述
   led_control.c文件中通过三个函数实现三种流水灯的效果。

   在这个工程中需要将流水灯的控制方式打包,也就是要将led_control.c这个文件打包为lib库文件。

   首先调试当前工程,确保函数功能都能正确执行。
在这里插入图片描述
   下载运行,观察流水灯的现象,确保函数功能都正常。

   接下来开始将led_control.c文件生成为库文件。

   首先要新建一个工程,新建工程时注意单片机型号的选择。
在这里插入图片描述
   在Advanced settings选项中将output type类型选为Static Library。
然后点击Finish按钮,创建新的工程。
在这里插入图片描述

   新工程创建完成后,删除默认的main.c文件。
在这里插入图片描述
   然后进入到当前工程文件夹中,将上一个工程中的led_control.c文件拷贝到当前工程文件夹中。
在这里插入图片描述
   拷贝完成后,工程中就会自动出现led_control.c文件。
在这里插入图片描述

   接下来还需要添加工程中需要的头文件,在工程上单击鼠标右键,选择Properties

在这里插入图片描述

   然后在Include Options依次添加需要用到的头文件。
在这里插入图片描述
在这里插入图片描述

   这里主要添加官方库中的头文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

   最后还需要将上一个工程中leds这个文件夹路添加进来,因为需要生成lib库文件的这个led_control.c还需要依赖leds文件夹中的其他几个文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
   所以当前项目中就不需要再添加leds.h和led_control.h头文件了,直接引用上一个项目的文件路径就行。

   添加完成之后编译工程,工程编译完成之后,在Debug文件夹中就会出现生成generate_led_lib.lib 文件。
在这里插入图片描述
   接下来在新的工程中,就可以直接调用这个 lib文件了。

   在ccs中直接复制一个刚才的流水灯工程
在这里插入图片描述
   名字修改为call_led_lib
在这里插入图片描述

   使用这个工程来调用刚才生成的lib库,在工程中直接删除led_control.c文件。
在这里插入图片描述

   然后打开工程文件夹,将generate_led_lib工程中Debug文件夹里面生成的generate_led_lib.lib文件 复制到call_led_lib工程中的APP—leds文件夹中
在这里插入图片描述

   相当于使用generate_led_lib.lib文件来代替刚才led_control.c文件的功能。
此时工程中就会自动将generate_led_lib.lib文件添加进去。
在这里插入图片描述

   下来编译当前工程
在这里插入图片描述

   工程编译成功,没有出现错误,说明刚才使用generate_led_lib.lib文件来代替led_control.c是成功的。
在这里插入图片描述

   下载到单片机中执行,观察led闪烁现象,效果和waterfall_light工程执行的效果是一样的。
在这里插入图片描述

   在工程中按住ctrl键单击display1、display2、display3这三个函数,发现这三个函数不能跳转。说明generate_led_lib.lib文件,已经成功的将这个三个函数封装起来了,只能调用,不能看到函数实现的具体过程。

   这样通过静态库的方法,就可以对项目中的核心技术进行软件层面的加密。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis 的简单运用介绍

Mybatis 用于操作数据库 操作数据库肯定需要: 1.SQL语句 2.数据库对象和 java 对象的映射 接下来我们看看怎么使用 Mybatis 我们先搞一些数据库内容 然后将其这些内容和Java对象进行映射 再创建一个类实现 select * from 再写一个类证明上述代码是否可以实现 别忘了在appli…

unity学习笔记13

一、常用物理关节 Unity中的物理关节(Physics Joints)是用于在游戏中模拟和控制物体之间的连接。物理关节允许你在对象之间应用各种约束,例如旋转、移动或固定连接,以模拟真实世界中的物理交互。 物理关节类型: 1.F…

C 语言-数组

1. 数组 1.1 引入 需求:记录班级10个学员的成绩 需要定义10个变量存在的问题:变量名起名困难变量管理困难需求:记录班级1000个学员的成绩 1.2 概念 作用:容纳 数据类型相同 的多个数据的容器 。 特点: 长度不可变容纳 数据类型…

Django 用户验证与权限管理详解

概要 Django是一款强大且灵活的Python Web框架,不仅在构建功能复杂的网站应用中表现出色,还在诸如用户验证、权限管理等细微之处提供了优秀的解决方案。在多用户、权限复杂的Web应用中,认证和权限管理尤其重要。接下来,我们就来探…

数据之美:数据可视化的力量与必要性

在当今信息爆炸的时代,数据量呈指数级增长,它们是我们日常生活和工作中的重要组成部分。然而,数据本身是无生命的数字和统计,若不能有效地被理解、传达和利用,其潜力就难以实现。这正是数据可视化变得越来越重要的原因…

深入了解Java8新特性-日期时间API之ChronoUnit、ChronoField

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概3000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…

基于gitlab的webhook集成jenkins,并在gitlab流水线中展示jenkins的job状态信息

文章目录 1. 环境信息2. gitlab 部署3. jenkins部署4. gitlab集成jenkins4.1 jenkins的凭据上保存gitlab的账号信息4.2 jenkins中配置gitlab的连接信息4.3 编写jenkins上pipeline文件4.4 jenkins上创建pipeline项目4.5 gitlab上配置webhooks事件4.6 测试 1. 环境信息 gitlab服…

LangChain 16 通过Memory记住历史对话的内容

LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…

Windows系列:windows2003-建立域

windows2003-建立域 Active Directory建立DNS建立域查看日志xp 加入域 Active Directory 活动目录是一个包括文件、打印机、应用程序、服务器、域、用户账户等对象的数据库。 常见概念:对象、属性、容器 域组件(Domain Component,DC&#x…

snat与dnat

一.SNAT的原理介绍 1.应用环境 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) 2.SNAT原理 源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映谢 数据包从内网发送到公网时&#xf…

Loki安装部署

Loki安装部署 1、Loki介绍 Loki 是受 Prometheus 启发由 Grafana Labs 团队开源的水平可扩展,高度可用的多租户日志聚合系统。开发语 言: Google Go。它的设计具有很高的成本效益,并且易于操作。使用标签来作为索引,而不是对全文进行检索&…

<avue-crud/>,二级表头,children下字典项的dicUrl失效问题

目录 1.提出问题&#xff1a; 1.1 代码&#xff1a; 1.2 效果图&#xff1a;会发现处在children下的dicUrl失效了 2. 解决思路 3. 解决代码&#xff08;你要的都在这&#xff0c;看这里&#xff09; 1.提出问题&#xff1a; 在使用<avue-crud/>组件实现二级表头时&…

C++中异常的栈展开概念

C中的异常栈展开是指&#xff0c;当某个函数中有异常产生&#xff08;这里不考虑是主动抛出的还是被动产生的&#xff09;&#xff0c;在异常被捕获之前的函数调用链上&#xff0c;函数不会正常执行返回&#xff0c;即异常产生之后的程序逻辑不会被执行。 &#xff08;注意&…

Kafka的存储机制和可靠性

文章目录 前言一、Kafka 存储选择二、Kafka 存储方案剖析三、Kafka 存储架构设计四、Kafka 日志系统架构设计4.1、Kafka日志目录布局4.2、Kafka磁盘数据存储 五、Kafka 可靠性5.1、Producer的可靠性保证5.1.1、kafka 配置为 CP(Consistency & Partition tolerance)系统5.1.…

建堆的时间复杂度和堆排序

文章目录 建堆的时间复杂度向下调整建堆向上调整建堆 堆排序实现 建堆的时间复杂度 下面都以建大堆演示 向下调整建堆 void Adjustdown(HPDataType* a, int size,int parent) {int child parent * 2 1;while (child < size){if (child1<size&&a[child 1] &…

Pandas进阶:transform 数据转换的常用技巧

引言 本次给大家介绍一个功能超强的数据处理函数transform&#xff0c;相信很多朋友也用过&#xff0c;这里再次进行详细分享下。 transform有4个比较常用的功能&#xff0c;总结如下&#xff1a; 转换数值 合并分组结果 过滤数据 结合分组处理缺失值 一. 转换数值 pd.…

贪心算法的介绍

贪心算法&#xff08;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解&#…

Windows 基于 VMware 虚拟机安装银河麒麟高级服务器操作系统

前言 抱着学习的态度研究一下麒麟系统的安装 银河麒麟&#xff08;KylinOS&#xff09;原是在“863计划”和国家核高基科技重大专项支持下&#xff0c;国防科技大学研发的操作系统&#xff0c;后由国防科技大学将品牌授权给天津麒麟&#xff0c;后者在2019年与中标软件合并为…

如何选择共模噪声滤波器

在当前电子产品中&#xff0c;绝大多数的高速信号都使用地差分对结构。 差分结构有一个好处就是可以降低外界对信号的干扰&#xff0c;但是由于设计的原因&#xff0c;在传输结构上还会受到共模噪声的影响。 共模噪声滤波器就可以用于抑制不必要的共模噪声&#xff0c;而不会对…

RNN:文本生成

文章目录 一、完整代码二、过程实现2.1 导包2.2 数据准备2.3 字符分词2.4 构建数据集2.5 定义模型2.6 模型训练2.7 模型推理 三、整体总结 采用RNN和unicode分词进行文本生成 一、完整代码 作者在文章开头地址中使用C实现了这一过程&#xff0c;为了便于理解&#xff0c;这里我…