CN104281443B - 利用tcm实现代码、数据替换的方法 - Google Patents
利用tcm实现代码、数据替换的方法 Download PDFInfo
- Publication number
- CN104281443B CN104281443B CN201310293596.4A CN201310293596A CN104281443B CN 104281443 B CN104281443 B CN 104281443B CN 201310293596 A CN201310293596 A CN 201310293596A CN 104281443 B CN104281443 B CN 104281443B
- Authority
- CN
- China
- Prior art keywords
- code
- address
- data
- new
- replacement
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明实施例公开了一种利用TCM实现代码替换的方法,包括:将第一代码加载到指令紧密耦合内存ITCM中;将所述ITCM的地址配置为第一代码地址;其中,所述第一代码地址是被所述第一代码对应的第一新代码段所替换的第一旧代码段的调用地址。本发明实施例还公开了一种利用TCM实现数据替换的方法,包括:将第一数据加载到数据紧密耦合内存DTCM中;将所述DTCM的地址配置为第一数据地址;本发明的代码、数据替换方法可以在不修改执行软件二进制编码的情况下实现代码、数据的替换,能有效的降低代码、数据替换时出现错误的概率。
Description
技术领域
本发明涉及到嵌入式系统的代码、数据替换方法,特别涉及到一种利用嵌入式系统处理器的紧密耦合内存(Tightly Coupled Memory,简称,TCM)实现代码、数据替换的方法。
背景技术
随着嵌入式系统的发展,嵌入式系统的软件功能越来越复杂,软件代码也越来越庞大,为了降低软件修改的成本开销,嵌入式系统的软件和数据通常都会采用模块化的设计方式,通过程序模块中调用其他程序模块和数据模块的方式来实现各种功能。
嵌入式系统中运行的执行文件一般分两个步骤得到:将源文件编译成目标文件和/或库文件;将目标文件和/或库文件进行链接得到可执行文件。执行文件实际是由一条一条CPU能够识别的机器码以及被初始化过的数据等组成。
在嵌入式系统的软件功能更新或修改时,有时会需要将部分代码和/或数据用新的代码和/或数据替换。
现有技术处理软件的代码、数据替换时,通常采用的方法有两种:
方法一是修改软件源代码,在软件源代码中修改需要替换的代码和/或数据,然后重新编译、链接整个软件获得新的可执行文件。
这种方法的主要缺点是,必须对相关程序的源代码进行修改,而嵌入式系统软件中经常会用到第三方以非源代码方式提供的程序(第三方提供的程序代码通常是目标文件或库文件等形式),如果需要替换的代码和/或数据要被第三方以非源代码方式提供的程序调用;因为没有对应的源代码,就无法采用这种方法来实现代码、数据的替换。
方法二是首先将新的代码段和/或数据添加到执行文件中(可以将新代码和/或数据编译成目标文件或库文件,与原执行文件的目标文件或库文件进行链接;也可以直接将新代码和/或数据的二进制编码添加到执行文件二进制编码中。),并在软件加载时将其加载到RAM运行空间;修改嵌入式软件执行文件中需要调用被替换的代码段和/或数据之处的机器码,将其修改为调用新代码段和/或新数据。
方法二虽然能够解决方法一的缺点,但是修改执行文件的机器码(二进制编码)极易造成执行文件的不稳定,特别是执行文件中被替换的代码段和/或数据段被调用之处较多时,软件机器码修改的工作量很大且容易出现修改遗漏或错误。
发明内容
有鉴于此,本发明提出了一种利用TCM实现代码、数据替换的方法,以解决现有技术中存在的问题。
在一些处理器(例如,ARM)中设计有内置的TCM。由于TCM在处理器内部且存取速度与Cache相当,所以它主要用于存放一些经常使用的代码或数据,减少CPU通过数据总线访问外部存储设备的次数与耗时。TCM分两类:用于存放代码的指令紧密耦合内存(Instruction Tightly-Coupled Memory,简称,ITCM);用于存放数据的数据紧密耦合内存(Data Tightly-Coupled Memory,简称,DTCM),每个TCM的物理地址空间在软件流程中可以动态配置,并可以动态使能或禁用。
TCM作为一种可动态配置物理地址的特殊内存,有一特性:当TCM配置的物理地址与其他地址重合时,处理器访问该地址时只能访问TCM,而不能访问该地址所对应的其他存储空间。
本发明的技术方案包括利用TCM实现代码替换的方法和利用TCM实现数据替换的方法。
一种利用TCM实现代码替换的方法,包括:
使能ITCM;
将第一代码加载到ITCM中;
将所述ITCM的地址配置为第一代码地址;
其中,所述第一代码地址是被所述第一代码对应的第一新代码段所替换的第一旧代码段的调用地址。
可选的,所述方法的各步骤在引导程序中执行。
进一步的,所述方法还可以包括,预先将所述第一代码添加到所述引导程序中。
可选的,所述方法的各步骤由操作系统任务调度程序调用代码替换任务执行。
可选的,所述方法还包括:
在所述第一新代码段的最后执行:
将第二代码加载到所述ITCM中;
将所述ITCM的地址配置为第二代码地址;
其中,所述第二代码地址是被所述第二代码对应的第二新代码段所替换的第二旧代码段的调用地址。
可选的,所述第二代码是代码调用程序,用于从所述第二新代码段的调用地址调用所述第二新代码段。
可选的,所述第一代码是代码调用程序,用于从所述第一新代码段的调用地址调用所述第一新代码段。
一种利用TCM实现数据替换的方法,包括:
使能DTCM;
将第一数据加载到DTCM中;
将所述DTCM的地址配置为第一数据地址;
其中,所述第一数据地址是被所述第一数据所替换的第一旧数据段的调用地址。
可选的,所述方法的各步骤在引导程序中执行。
进一步的,所述方法还包括:预先将所述第一数据添加到所述引导程序中。
可选的,所述方法的各步骤由操作系统任务调度程序调用数据替换任务执行。
可选的,所述调用地址是虚拟地址或物理地址。
本发明的方法利用处理器的ITCM来加载新代码段,将ITCM的地址配置为所述新代码段将要替换的旧代码段的调用地址,这样,无需修改调用该新代码段的程序的二进制编码,即可实现代码替换。同时,利用处理器的DTCM来加载新数据段,将DTCM的地址配置为所述新数据段将要替换的旧数据段的调用地址,这样,无需修改调用该新数据段的程序的二进制编码,即可实现数据替换。可以避免修改软件二进制编码造成的执行文件不稳定以及容易遗漏及出错的问题,同时也提高了软件修改时实现代码、数据替换的效率。
附图说明
图1是现有技术实现代码、数据替换的方法二的流程图
图2是本发明具体实施例1的流程图;
图3是本发明具体实施例2的流程图;
图4是本发明具体实施例3代码替换方法流程图;
图5是本发明具体实施例3数据替换方法流程图;
具体实施方式
为进一步说明本发明的技术方案,下面通过具体实施例结合附图详细说明。
具体实施例1
本具体实施例为本发明利用TCM实现代码替换的一种优选实施方式,本实施例代码替换流程如图2所示。
本实施例中,首先需要执行步骤100,修改执行文件:
100、将第一新代码段添加到执行文件中;
具体的添加方法可以是背景技术中所述的方法或任意一种现有技术的添加方法;本实施例对此没有限制。
101、使能ITCM;
102、将第一代码加载到所述ITCM中;
103、配置所述ITCM的地址为第一代码地址。
嵌入式系统的软件通常可以分为引导程序、操作系统和各功能程序,嵌入式系统上电开机后,处理器首先会加载运行引导程序,进行系统初始化,系统初始化完成后,引导程序会加载操作系统的任务调度程序,然后跳转到操作系统任务调度程序运行。任务调度程序根据系统运行的需要调度各功能程序运行以完成各项功能。
本实施例中,代码替换流程可以在引导程序中执行:
引导程序在加载操作系统的任务调度程序后,执行所述代码替换流程的步骤101~103;然后跳转到操作系统任务调度程序运行。
可选的,所述第一代码可以是预先添加到所述引导程序的镜像文件中,由所述引导程序直接将所述第一代码搬移到所述ITCM中;
可选的,所述第一代码也可以是独立保存在嵌入式系统的存储器中,由所述引导程序将所述第一代码从存储器中加载到所述ITCM中。
本实施例中,代码替换流程也可以通过操作系统任务调度的方式执行:
在嵌入式系统软件中增加一个包括所述步骤101~103的代码替换任务程序,由操作系统任务调度程序调用该任务执行所述代码替换流程。
需要说明的是,上述仅仅是对代码段替换流程步骤执行方式的举例说明,本发明对于代码段替换流程步骤的具体执行方式并没有限制。如,本实施例中还可以通过在第一任务中执行所述步骤101~103;所述第一任务为在调用所述第一代码的任务之前执行的且源代码可以修改的任务程序。
可选的,所述第一代码可以是用于替换第一旧代码段的新代码段;
可选的,所述第一代码还可以是代码调用程序,执行所述第一代码可以调用第一新代码段。采用本优选实现方案可以减少代码替换所需的ITCM空间,可以利用较小的ITCM空间实现体积较大的新代码段的替换。
所述第一代码地址为被所述第一代码对应的第一新代码段所替换的第一旧代码段的调用地址;
所述调用地址可以是虚拟地址也可以是物理地址。
本实施例中,所述调用地址是指被调用代码的存储地址或运行地址。
具体实施例2
本具体实施例为本发明利用TCM实现数据替换的一种优选实施方式,本实施例总体流程如图3所示。
本实施例中,首先首先需要执行步骤200,修改执行文件:
200、将第一新数据段添加到执行文件中;
具体的添加方法可以是背景技术中所述的方法或任意一种现有技术的添加方法;本实施例对此没有限制。
201、使能DTCM。
202、将第一数据加载到所述DTCM中;
203、配置所述DTCM的地址为第一数据地址;
嵌入式系统的软件通常可以分为引导程序、操作系统和各功能程序,嵌入式系统上电开机后,处理器首先会加载运行引导程序,进行系统初始化,系统初始化完成后,引导程序会加载操作系统的任务调度程序,然后跳转到操作系统任务调度程序运行。任务调度程序根据系统运行的需要调度各功能程序运行。
本实施例中,数据段替换流程可以在引导程序中执行:
引导程序在加载操作系统的任务调度程序后,执行所述数据替换流程的步骤201~203;然后跳转到操作系统任务调度程序运行。
可选的,所述第一数据可以是预先添加到所述引导程序的镜像文件中,由所述引导程序直接将所述第一数据搬移到所述DTCM中;
可选的,所述第一数据也可以是独立保存在嵌入式系统的存储器中,由所述引导程序将所述第一数据从存储器中加载到所述DTCM中。
本实施例中,数据段替换流程也可以通过操作系统任务调度的方式执行:
在嵌入式系统软件中增加一个包括所述步骤201~203的数据替换任务程序,由操作系统任务调度程序调用该任务执行所述数据替换流程。
需要说明的是,上述仅仅是对数据段替换流程步骤执行方式的举例说明,本发明对于数据段替换流程步骤的具体执行方式并没有限制。如,本实施例中还可以通过在第一任务中执行所述步骤201~203;所述第一任务为在调用所述第一数据的任务之前执行的且源代码可以修改的任务程序。
所述第一数据可以是用于替换旧数据段的新数据段;
所述第一数据地址为被所述第一数据所替换的第一旧数据段的调用地址;
所述调用地址可以是虚拟地址也可以是物理地址。
本实施例中,所述调用地址是指被调用数据的存储地址。
具体实施例3
下面,以一个在嵌入式系统中具体的代码、数据替换流程来进一步说明本发明的方法。
嵌入式系统的处理器内置有一个ITCM和一个DTCM。嵌入式软件系统包括有操作系统任务调度程序Service Management和多个功能程序Service(i);其中,功能程序Service(2)为第三方提供,无法对程序进行直接修改。
Service(2)在执行过程中会调用代码段Code1、Code2;其中,Code1的调用地址为address_C1,Code2的调用地址为address_C2,Code1在Code2之前被调用。
Service(2)在执行过程中还会调用数据段Data1、Data2;其中,Data1的调用地址为address_D1,Data2的调用地址为address_D2,Data1在Data2之前被调用。
本实施例中,需要将Code1替换为Code1_new代码段,将Code2替换为Code2_new代码段,将Data1替换为Data1_new数据段,将Data2替换为Data2_new数据段。
本实施例实现所述代码替换的流程如图4所示,包括:
300、预先将所述Code1_new、Code2_new添加到执行文件中,并建立一个代码替换任务Service_codereplace;
301、使能所述ITCM;
302、Service Management调度Service_codereplace执行,将Code1_new加载到ITCM中;
本步骤中,所述加载具体操作可以是直接将Code1_new代码段加载到ITCM中;也可以是在ITCM中加载一个代码调用程序,执行该代码调用程序会调用所述Code1_new代码段。
303、Service_codereplace将所述ITCM的地址配置为address_C1;
需要说明的是,本领域技术人员显然清楚,上述步骤301~303应当在所述Service(2)中调用Code1的指令执行之前执行;当Service(2)执行调用Code1的指令时,实际上是调用了所述Code1_new;
304、Code1_new执行完成后,将Code2_new加载到ITCM中;
305、将所述ITCM的地址配置为address_C2;
需要说明的是,本领域技术人员显然清楚,上述步骤304~305应当在所述Service(2)中调用Code2的指令执行之前执行;当Service(2)执行调用Code2的指令时,实际上是调用了所述Code2_new;
所述步骤304和305可以由所述Service Management调度Service_codereplace执行。
作为本实施例的一种优选实现方案,可以在所述Code1_new代码段的末尾增加指令来直接执行所述步骤304和305。
本优选实现方案可以减少Service Management的调度次数,减少代码、数据替换流程对Service(2)程序执行的影响。
本实施例的代码替换方法可以利用一个ITCM实现多个不同的代码段的替换,需要说明的是,上述仅为举例说明,并非对本发明的限定,例如,所述步骤301~303也可以在引导程序中执行或在第一任务中执行。所述第一任务为在调用所述第一代码的任务之前执行的且源代码可以修改的任务程序。虽然本实施例中描述的是2个代码段替换的流程,但本领域技术人员显然清楚,本实施例的方法同样也可以用于3个以上不同代码段的替换。
本实施例中,各代码段的调用地址是指被调用代码的存储地址或运行地址。
本实施例实现所述数据替换的流程如图5所示,包括:
310、预先将所述Data1_new、Data2_new添加到执行文件中,并建立一个数据替换任务Service_datareplace;
311、使能DTCM;
312、Service Management调度Service_datareplace执行,将Data1_new加载到DTCM中;
313、Service_datareplace将所述DTCM的地址配置为address_D1;
需要说明的是,本领域技术人员显然清楚,上述步骤311~313应当在所述Service(2)中调用Data1的指令执行之前执行;当Service(2)执行调用Data1的指令时,实际上是调用了所述Data1_new;
314、在Service(2)完成对Data1_new的使用后,将Data2_new加载到ITCM中;
315、将所述DTCM的地址配置为address_D2;
需要说明的是,本领域技术人员显然清楚,上述步骤314~315应当在所述Service(2)中调用Data2的指令执行之前执行;当Service(2)执行调用Data2的指令时,实际上是调用了所述Data2_new;
所述步骤314和315可以由Service Management调度Service_datareplace执行。
本实施例的数据替换方法可以利用一个DTCM实现多个不同的数据段的替换,需要说明的是,上述仅为举例说明,并非对本发明的限定,例如,所述步骤311~313也可以在引导程序中执行或在第一任务中执行。所述第一任务为在调用所述第一数据的任务之前执行的且源代码可以修改的任务程序。虽然本实施例中描述的是2个数据段的替换流程,但本领域技术人员显然清楚,本实施例的方法同样也可以用于3个以上不同数据段的替换。
本实施例中,各数据段的调用地址是指被调用数据的存储地址。
本领域的一般技术人员显然应该清楚并且理解,本发明所举的以上实施例仅用于说明本发明,而并不用于限制本发明。例如,本发明实施例中的代码替换方法和数据替换方法并不排斥,可以同时执行;代码替换任务和数据替换任务可以是同一个任务程序等。在不背离本发明的精神及其实质的情况下,本领域技术人员当可根据本发明做出各种相应的改变或变形,但这些相应的改变或变形均属于本发明的权利要求保护范围。
Claims (11)
1.一种利用TCM实现代码替换的方法,其特征在于,包括:使能指令紧密耦合内存ITCM;
将第一代码加载到ITCM中;
将所述ITCM的地址配置为第一代码地址;
其中,所述第一代码地址是被所述第一代码对应的第一新代码段所替换的第一旧代码段的调用地址;
第一代码是用于替换第一旧代码段的新代码段,或者
第一代码是代码调用程序,执行所述第一代码调用第一新代码段;
ITCM表示用于存放代码的指令紧密耦合内存;
TCM表示紧密耦合内存。
2.根据权利要求1所述的方法,其特征在于:所述方法的各步骤在引导程序中执行。
3.根据权利要求2所述的方法,其特征在于,所述方法还包括:预先将所述第一代码添加到所述引导程序中。
4.根据权利要求1所述的方法,其特征在于:所述方法的各步骤由操作系统任务调度程序调用代码替换任务执行。
5.根据权利要求1所述的方法,其特征在于,所述方法还包括:在所述第一新代码段的最后执行:将第二代码加载到所述ITCM中;
将所述ITCM的地址配置为第二代码地址;
其中,所述第二代码地址是被所述第二代码对应的第二新代码段所替换的第二旧代码段的调用地址;所述第二代码是代码调用程序,用于从所述第二新代码段的调用地址调用所述第二新代码段。
6.根据权利要求1~5中任意一项所述的方法,其特征在于:调用地址是虚拟地址或物理地址。
7.一种利用TCM实现数据替换的方法,其特征在于,包括:使能数据紧密耦合内存DTCM;
将第一数据加载到DTCM中;
将所述DTCM的地址配置为第一数据地址;
其中,所述第一数据地址是被所述第一数据所替换的第一旧数据段的调用地址;
所述第一数据是用于替换旧数据段的新数据;
DTCM表示用于存放数据的数据紧密耦合内存;
TCM表示紧密耦合内存。
8.根据权利要求7所述的方法,其特征在于:所述方法的各步骤在引导程序中执行。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:预先将所述第一数据添加到所述引导程序中。
10.根据权利要求7所述的方法,其特征在于:所述方法的各步骤由操作系统任务调度程序调用数据替换任务执行。
11.根据权利要求7~10中任意一项所述的方法,其特征在于:所述第一旧数据段的调用地址是虚拟地址或物理地址。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310293596.4A CN104281443B (zh) | 2013-07-12 | 2013-07-12 | 利用tcm实现代码、数据替换的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310293596.4A CN104281443B (zh) | 2013-07-12 | 2013-07-12 | 利用tcm实现代码、数据替换的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104281443A CN104281443A (zh) | 2015-01-14 |
CN104281443B true CN104281443B (zh) | 2020-06-26 |
Family
ID=52256353
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310293596.4A Active CN104281443B (zh) | 2013-07-12 | 2013-07-12 | 利用tcm实现代码、数据替换的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104281443B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105468410B (zh) * | 2015-11-24 | 2019-02-12 | 小米科技有限责任公司 | 系统升级方法及装置 |
CN109086086B (zh) * | 2018-08-06 | 2021-06-08 | 深圳忆联信息系统有限公司 | 一种非空间共享的多核cpu的启动方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1661548A (zh) * | 2004-02-26 | 2005-08-31 | 明基电通股份有限公司 | 绕道修补程序的方法及使用该方法的电子装置 |
CN1740971A (zh) * | 2004-08-27 | 2006-03-01 | 华为技术有限公司 | 基本输入输出系统程序和主机程序的升级方法 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7290107B2 (en) * | 2004-10-28 | 2007-10-30 | International Business Machines Corporation | Direct deposit using locking cache |
CN100533383C (zh) * | 2006-11-03 | 2009-08-26 | 北京飞天诚信科技有限公司 | 一种对软件中的数据进行替换的方法 |
TWI365456B (en) * | 2008-01-07 | 2012-06-01 | Realtek Semiconductor Corp | Apparatus for predicting memory access and method thereof |
CN102567220A (zh) * | 2010-12-10 | 2012-07-11 | 中兴通讯股份有限公司 | Cache存取的控制方法及装置 |
-
2013
- 2013-07-12 CN CN201310293596.4A patent/CN104281443B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1661548A (zh) * | 2004-02-26 | 2005-08-31 | 明基电通股份有限公司 | 绕道修补程序的方法及使用该方法的电子装置 |
CN1740971A (zh) * | 2004-08-27 | 2006-03-01 | 华为技术有限公司 | 基本输入输出系统程序和主机程序的升级方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104281443A (zh) | 2015-01-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11853774B2 (en) | Dynamically loaded plugin architecture | |
US9891939B2 (en) | Application compatibility with library operating systems | |
CN111061638B (zh) | 一种iOS系统调试的方法、装置及服务器 | |
CN101957766B (zh) | 一种字节码织入方法、装置及系统 | |
CN105159738A (zh) | 一种热补丁实现方法及系统 | |
CN105975816A (zh) | 移动终端下基于虚拟技术的代码保护方法及系统 | |
US20070089101A1 (en) | Method of interpreting method bytecode and system operated by the same | |
WO2008113291A1 (fr) | Procédé et système pour appeler des fonctions | |
CN102364433B (zh) | 在ARM处理器上实现Wine构建工具移植的方法 | |
CN111666210A (zh) | 一种芯片验证方法及装置 | |
US10452364B2 (en) | Method and system for preparing code to be executed by programmable control devices | |
CN104281443B (zh) | 利用tcm实现代码、数据替换的方法 | |
CN109558121A (zh) | 接口驱动程序的开发方法、装置、设备及存储介质 | |
KR20070096316A (ko) | 무선 센서 네트워크 환경에서 프로그램을 변경하기 위한확장 가능한 가상 머신 및 이를 이용한 리프로그래밍 방법 | |
CN113342376B (zh) | 一种针对物联网设备的操作系统进行升级的方法及装置 | |
KR101083271B1 (ko) | 액티브엑스 컨트롤 변환 시스템 및 방법 | |
CN112882753A (zh) | 程序运行方法及装置 | |
JP6295914B2 (ja) | プログラマブルコントローラシステム、その支援装置、プログラマブルコントローラ | |
CN102331940A (zh) | 一种将应用程序装载到安卓手机上的方法及系统 | |
CN110990041A (zh) | 一种bootloader升级方法及系统 | |
JP2017111656A (ja) | モジュール置換システム、方法及びプログラム | |
CN115373747A (zh) | 指令扩展方法、系统及计算机可读存储介质 | |
JP2006039879A (ja) | クラスファイル実行方法およびJava(R)実行環境プログラム | |
US9436462B2 (en) | Identifying singleton classes | |
CN103809949A (zh) | 手持式数字存储示波表的WinCE系统平台的开发方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20170420 Address after: Nanping Street 400060 Chongqing Nan'an District Nancheng Road No. 199 left attached to the floor 403 Applicant after: Keen (Chongqing) Microelectronics Technology Co., Ltd. Address before: 400065 Chongqing Nan'an District huangjuezhen pass Fort Park No. 1 Applicant before: Chongqing City Communication & Technology Co., Ltd. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |