admin 管理员组

文章数量: 1086019


2024年3月26日发(作者:javaweb工程师)

使用CCS进行DSP编程(一)

——CCS编程入门

pacificxu

TI公司提供了高效的C编译器和集成开发环境Code Composer Studio,学

习‘C6X的编程应该从学习CCS的使用开始。

首先安装CCS,CCS的安装有详细的说明,并配有简短的Quick Time的多媒

体介绍,对于没有购买CCS的用户,可以从TI处得到30天的试用版(没有硬件

仿真功能)。

使用CCS前需要对CCS进行设置,以Simulator为例,运行Setup CCS C6000

1.20,安装Device Driver,对于有硬件支持的仿真器,可以选择配套的CCS驱

动,设置完成的画面如下图所示:用户的界面大致相同。

接下来就可以运行CCS了,CCS提供了比较好的例子,对于初学者,仔细学

习这些例子,会起到事半功倍的效果。在CCS的Help菜单的Tutorial子菜单下,

给出了四个教程,分别是:Code Composer Studio Tutorial、Advanced DSP/BIOS

Tutorial、Compiler Tutorial和RTDX Tutorial,用户可以从简单的CCS功能

开始,如创建一个工程文件Project,到创建一个完善的用户程序一步一步的进

行。

下面是Code Composer Studio Tutorial的例子:

分别从生成一个简单的“Hello World”程序,到使用DSP/BIOS功能,到程序的

调试,实时分析,I/O操作等分6课来讲解,可以领略TI的CCS的强大功能。

下面以“Hello World”程序为例讲一下CCS的使用。

首先打开一个Project文件

这些文件的路径如下图所示:

打开,会看到如下图所示的界面。将File View栏中的“+”号

都打开,会看到整个项目工程中的所有资源。

其中*.c文件和*.h文件与普通的C语言编程中是一致的(TI编译器支持

ANSI C标准)。需要指出的是三个文件:、、。

文件给出了程序空间和数据空间的设置、及编译后各程序段在程序或

数据空间的具体位置。文件为DSP运行时库,为中断

向量表,都是区别于纯软件编程的独到之处,熟悉以后会有更深的体会。

下图为文件的代码,MEMORY分为程序空间IPRAM和数据空间

IDRAM,并分别给出了起始地址origin和长度len,各段在MEMORY空间的分配

也作了定义。对于实际的目标板硬件系统,由实际的存储器空间及DSP芯片上的

存储空间决定。对于软件仿真,可以不考虑有没有MEMORY资源。

直接对该工程进行编译,会得到如下结果,试一下吧!也可以试一下快捷工

具条上的按钮,随便点击鼠标右键,也会有意外的收获。怎么样?没有错误吧!

自己在编写工程项目文件时,经常会遇到下面的问题,没有C语言程序的入

口函数,细心比较一下会发现工程文件中缺少了一个运行时支持库

,不同的DSP芯片需要不同的运行时库来支持。

下面向项目工程中加上运行时库来纠正刚才的编译错误,同样

的方法可以用来向工程中添加*.c、*.cmd、*.asm文件。*.h文件在编译时会自

己找到(当然需要在环境变量中设置好啦,一般不需要改动)。

运行时库在TI的缺省路径下,注意将文件类型改为*.lib,

大家可能注意到,在HELLO.C文件中有这样的定义:

#ifdef FILEIO

int i;

char scanStr[BUFSIZE];

char fileStr[BUFSIZE];

size_t readSize;

FILE *fptr;

#endif

#ifdef FILEIO

/* clear char arrays */

for (i = 0; i < BUFSIZE; i++) {

scanStr[i] = 0 /* deliberate syntax error */

fileStr[i] = 0;

}

/* read a string from stdin */

scanf("%s", scanStr);

/* open a file on the host and write char array */

fptr = fopen("", "w");

fprintf(fptr, "%s", scanStr);

fclose(fptr);

/* open a file on the host and read char array */

fptr = fopen("", "r");

fseek(fptr, 0L, SEEK_SET);

readSize = fread(fileStr, sizeof(char), BUFSIZE, fptr);

printf("Read a %d byte char array: %s \n", readSize, fileStr);

fclose(fptr);

#endif

其中还有一些变量的定义和对文件的操作,运行编译好的程序后好象这些语句都

没有执行,因为在CCS的编译环境中这个参数还没有定义。按下图进行设置:

设置完成后可以进行重新编译,会发现新的错误(如果没有出现这个错误,说明

设置的不对)。双击这个错误,在HELLO.C文件中,光标会出现在出错的地方。

在第52行的这一句,可以看到语句的后面没有加“分号”,

scanStr[i] = 0

加上“分号”后重新编译,ok?!加载运行,会出现下面的输入界面,

输入一串文字并确定,在“Stdout”窗口会有下面的显示,

小结:在这里简单介绍了CCS的使用,包括CCS的设置、帮助文件的使用,(TI

的帮助文件系统、详细地介绍了CCS的使用,强烈建议用户认真学习。)

并以“Hello World”程序为例对CCS的使用中容易出现问题的一些地方作了一

般的介绍,包括运行时库的添加、预编译定义设置等,用户在使用过程中会不断

发现问题,通过使用TI的帮助文件及配套的资料会不断提高,不可急于求成,

如果用户对Visual C++比较熟悉,学起来会快很多;相反,那肯定要多花一些

时间来学习了,学习CCS跟学习Visual C++一样(简单/复杂?),但需要对硬

件有一定的了解。

使用CCS进行DSP编程(二)

——实现FFT

pacificxu

现在讨论使用TI公司的CCS进行DSP编程,首先假定读者对CCS的使用

已经比较了解,如果读者还不太了解,请参阅《使用CCS进行DSP编程(一)

——CCS编程入门》及其他CCS的学习文档。

作数字信号处理的同志们总是喜欢用FFT来对信号处理系统做检验,下面用

闻亭公司的C6xP板、C6xPa板硬件实现FFT算法,本算法对其他的C6x板同样

实用(只是硬件资源稍微有差异),并通过闻亭公司的PCI仿真器对目标板加载

运行,运行结果在CCS中可视化显示。

首先启动CCS Setup,对仿真器硬件进行设置,本人使用的是闻亭公司PCI

的仿真器自带的驱动,设置画面如下:

下面就可以运行CCS了,在CCS中,创建一个新的Project,

我的工程文件放置在如下的目录中,读者可以放在自己喜欢的目录下:

双击“+”展开,可以看到整个工程文件是空的,

我们需要把*.c、*.cmd、*.lib文件添加到工程文件中,

首先是*.c文件,本例中是test.c文件,

同样的方法可以用来添加其他的文件。双击工程中的源文件,会在右边的窗

口中看见原码:

如果*.c文件不存在,可以在CCS集成开发环境中生成,

本例中test.c的主程序源代码如下:

调用的子程序有三个:

从上面的源程序可以看到,使用CCS的C语言编程跟普通的C语言编程没

有太大的区别,这正是TI所追求的,兼容的ANSI C标准和如此的编译高效率

也正是TI的领先之处。读者可以不必学习烦琐的汇编和线性汇编,直接对数字

信号处理的算法进行研究,同时享受高速的处理速度,只有在对速度要求极严的

条件下,不得不使用汇编和线性汇编,那时读者已经有了一定的基础,再学习汇

编语言已是水到渠成。而使用C语言编程是大势所趋。

如果有人对算法本身感兴趣,请参阅胡广书老师的《数字信号处理—理论、

算法与实现》 第5章 快速傅立叶变换,这里不在对算法进行展开讨论。

程序的结构本身很简单,使用过C语言的朋友一看就明白,不需要再做

进一步的说明,需要指出几点,

1. 本程序中的math.h与Visual C++中的math.h是不同的,TI的CCS专门

为数学计算作了运行时库,是利用硬件对计算作加速的,与Visual C++

中的速度是不可同日而语的。因此如果我们需要用到相应的“头文件”,

就应该在TI的目录中查找,同时要包含相应的运行时库(*.lib)文件,

我一直在强调这一点,初学者往往忽略这一点而出现许多编译链接错误。

下面的演示中还会看到这一点。

2. 本例是以定点DSP芯片‘C6201为例的。如果对定点运算还不太熟悉,

只好找些文档来学习一下了,这里也不再展开。在浮点DSP芯片‘C6701

中本程序可以不加修改地运行,但浮点DSP芯片中可以直接进行有硬件

支持的浮点运算,速度会更快。

3. CCS的C语言中的数据类型是与硬件相关的,使用时需要注意。

char 8 bits

short 16 bits

int 32 bits

long 40 bits

float 32 bits

double 64 bits

TMS320C6000 Online Programmer's Guide (SPRH048) Copyright?2000

Texas Instruments

接下来继续进行,向工程中添加*.cmd文件。读者现在应该会执行这个操作

了,如果没有就自己造一个吧,也可以拿别人的来改造一下。其中有些不太明白

也没有关系,但是在与具体的硬件相关的地方还是要搞明白。

首先要搞明白目标板“target”上到底有多少存储空间,包括DSP芯片内部

有多大空间,目标板上有多少外部存储器(SDRAM、SBSRAM、双口RAM),

以及它们的其始地址和长度,以我使用的闻亭公司‘C6Xpa板为例,

存储器类型 起始地址 存储器大小 结束地址

SDRAM 0x2000000 4M*32bit (0x400000*4) 0x3000000

SBSRAM 0x400000 128k*32bit (0x20000*4) 0x480000

DPRAM 0x1400000 4k*32bit (0x1000*4) 0x1404000

在这里还要强调一点,是“*32bit”,因此SDRAM的结束地址是

0x2000000 + 0x400000*4 = 0x3000000

而不是

0x2000000 + 0x400000 = 0x2400000

其他存储空间也是如此。许多同志们忽略了这一点,在使用数组、指针及对空间

地址操作时造成“不可理解”的错误,“我往仫个地址写数怎么找不到,

#%^#&^%%^———坏 了!”,好好研究一下,就不好意思这么快下结论了。

下面是我用的*.cmd文件的源代码,需要的话可以拿去用喔。

里面“.vec、.text ….”的东西可以先不考虑,留给CCS去处理好了。只要保证

定义的空间在物理上存在就可以了。

心急的朋友会开始编译了,

又会出现下面的结果,

“$%*^&^,又忘了加运行时库!”。(下次再忘就不应该了!)。

这里展开一点,有些朋友说:“我包含了头文件,调用中断函数

intr_hook()时怎么也编译链接通不过,去掉这一句就通过了。”大家现在就应该知

道怎么处理这个问题了吧?熟悉C语言编程的同志都知道“*.lib”的实质,中断

函数intr_hook()在“”里。加上这个库问题估计该解决了吧! TI的运

行时库都有具体的说明,如果大家实在懒得去看,又不想知其所以然,有一个绝

招在此:“Find all *.lib in TI目录”一个一个试一下好了。

我们的问题解决了,接下来看一看能不能运行,执行对不对。

装入“”文件,

然后运行程序(F5)(热键、工具条、菜单都可以用啦),看一下结果对不对,

顺便体验一下CCS提供的“Very Good”功能:

弹出对话框,设置一下吧,

会出现下面的画面,

修改一下属性,

下面好看多了,

里面的三个谱峰看起来跟信号里造的三个频率的信号好象是对应的吧。在源文件

里进行些修改,例如将信号频率改为两个,

重新编译、链接、执行、显示,中间的谱线不见了。

总结:在这里演示了使用CCS的C语言实现FFT程序,仅仅是实现而已。

一个实际的系统,需要做许多优化处理,对核心算法进行详细的分析、规划,初

学时可以先不考虑这些,等熟悉后在进行深入研究。

好象我们成功了!(哗哗哗哗哗┉┉)

使用CCS进行DSP编程(三)

——实现DMA和Interrupt

pacificxu

现在讨论在CCS进行DSP编程来实现DMA和Interrupt功能。假定读者对

CCS的使用已经比较了解,并有了一定的CCS编程经验。如果读者还不太了解,

请参阅《使用CCS进行DSP编程(一)——CCS编程入门》、《使用CCS进行

DSP编程(二)——实现FFT》及其他CCS的学习文档。

下面用闻亭公司的C6xPa板硬件和闻亭公司的PCI仿真器为例,来实现DSP

的DMA传输和硬件Interrupt功能。

首先来描述一下使用的硬件资源。闻亭公司的C6xPa板有两路独立的最高采

样率为40MHz精度为12bit的A/D,它与DSP的EXT_INT7相连,可以产生外

部中断信号,通过FPGA的逻辑可以控制A/D的采集和采集多少数据产生一次

中断,采集的数据放在DPRAM中(0x1400000开始的地址空间),通过DMA

传输到DSP芯片上的存储器中(0x80000000开始的地址空间)。

在C语言环境中使用DMA和Interrupt功能,需要包含两个头文件

,同时要用到相应的运行时库文件“”和“”。对这

两组头文件和运行时库文件,我们深入研究一下,看一看我们比较关心的函数有

哪些。下一次用到这些函数时,别忘了带上相应的运行时库文件%*&^*&^喔。

在库文件中,直接与实现DMA和Interrupt功能相关的函数有如

下几个:

dma_init

dma_global_init

dma_reset

intr_reset

intr_init

intr_hook

intr_map

intr_isn

intr_get_cpu_intr

isr_jump_table

在库文件中,直接与实现DMA功能相关的函数有如下几个:

DMA_AllocGlobalReg

DMA_GetEventId

DMA_GBL_PRIVATE

DMA_Open

DMA_Start

DMA_HCHA0

DMA_HCHA1

DMA_HCHA2

DMA_HCHA3

DMA_Wait

DMA_SetGlobalReg

DMA_ConfigA

DMA_ConfigB

DMA_Stop

DMA_AutoStart

DMA_Pause

DMA_Reset

DMA_GetGlobalReg

DMA_SetAuxCtl

DMA_Close

DMA_FreeGlobalReg

DMA_Init

DMA_GetStatus

我们只需其中的一部分便可以实现DMA和Interrupt功能。函数的具体使

用说明和调用方式请参看TI

的说明档。

下面直接看一下程序的源码,有一个整体的理解,然后再对具体的相关内容

做一下说明,如果源码能够理解,就不需要再看具体说明了。为了便于读者理解,

本人对相应部分作了处理,尽量使结构清晰,突出对DMA和Interrupt功能的

实现:

接下来进行详细说明。

首先,包含头文件,

接着对DMA进行初始化赋值,

其中,各参数的含义如下:

我们使用DMA的源地址为0x01400000,目标地址为0x80008000,传输数据长

度为1k*32bit,DMA控制寄存器的值的具体含义请参看各对应DSP的datasheet。

然后是对使用的函数进行引用说明,其他函数跟普通的Visual C++函数没有

太大的区别,除了以下的例外:

其中,有一个关键字“interrupt”,它告诉TI的C编译器,这个函数是一个特殊

的中断服务函数,C编译器会另眼看待。

接下来对DMA操作句柄定义,相应的头文件对DMA_HANDLE作了定义,

我们这里可以直接使用:

主程序非常简单,

实现DMA功能的子程序也很简单,只有四句:

第一句:语法如下:

其中的DMA_CHAANY含义是“任意一个闲置的DMA通道”,并非有一个DMA

通道叫DMA_CHAANY,除了通道0~3的4个通道外,还有一个辅助DMA通

道,是另做他用的。我们取得了对DMA操作的句柄,就可以进行初始化和使用

了。

第二句:语法如下:

这里需要提前做DMA_CONFIG的初始化,这两步也可以用一步来实现,就用到

另外一个函数:

它直接把各DMA寄存器的设置当作参数,一步到位。

第三句:语法如下:

这个函数检测DMA的状态位,直到DMA结束后才退出,读者可以在下一次使

用这个DMA通道前使用。DSP可以执行其他的操作,或者执行此操作等待DMA

传输结束。

第四句:语法如下:

使用完DMA通道后,需要对它进行关闭,释放资源以备他用。

DMA的使用是很简单的,复杂的工作都由DSP硬件和TI的库函数来完成

了。我们要做的工作是理解这些,要想使用这些函数,不可避免要知道DMA各

控制寄存器的具体含义,除了少数“天才”可以不学而知外,最好老老实实学习

TI的文档)。#$&^@)(*&#——多么渴望天才的出现啊!!!

下面来看看中断功能是怎样实现的。在中断服务子程序中,调用了DMA,

完成数据的从外部双口RAM到DSP片内的传输,

而中断服务子程序是如何与硬件中断联系起来的呢?

中断的实现主要在中断初始化子程序里,在程序中对每一步的操作都进行了

详细的说明。我们一步一步来分析一下:

首先是用于中断处理的函数:

然后是用于中断处理的宏定义:

用到的一些助记符如下:

大家觉得上面的内容还不够丰富,请参阅TI的文档。

有了上面的理解,中断的实现过程就比较清楚了:

1. 初始化中断服务表指针(ISTP):intr_init();

2. 选择用哪一个中断: intr_map(CPU_INT7,ISN_EXT_INT7);

3. 清中断: INTR_CLR_FLAG(CPU_INT7);

4. 中断服务子程序与中断号挂钩: intr_hook(Int7_ISR,CPU_INT7);

5. 打开非屏蔽中断: INTR_ENABLE(CPU_INT_NMI);

6. 打开所选中断: INTR_ENABLE(CPU_INT7);

7. 全局中断使能: INTR_GLOBAL_ENABLE();

读者可能会注意到,中断处理函数都是小写的,而宏定义都是大写的,在C语

言的语法里是要注意的,否则会出现找不到函数或者函数未定义。

如果想用其他的中断源,可以按照上面的步骤依样而行,相信不会是什么太

难的事情了。每一步不是必须的,顺序也不是固定的。Int7_ISR是本人举例时

用的中断服务子程序名,大家可以使用任意的名字,而其中的程序也是随意根据

需要编写,没有太多的限制。读者如果对DSP的硬件很清楚,可以直接对中断

寄存器进行赋值,不需要调用这些函数与宏定义。

相信现在大家对中断与DMA的实现已经心中有数了,但我还要强调一下,

我所讲的实现是突出软件上的实现,进行DSP编程需要对硬件有足够必要的了

解,否则会遇到某些难以理解的问题,我在这里尽量不涉及硬件,只是希望大家

仔细对TI

有关资料认真研究,避免我的介绍产生先入为主的不良影响。例如我

在DMA中执行了对双口RAM的读操作,而双口RAM是连接在EMIF上的,

因此,进行读操作之前就必须对EMIF进行初始化操作,否则,出错是必然的,

而且很难找出错误原因,切记切记。

使用CCS进行DSP编程(四)

——实现Host和DSP通信

pacificxu

首先对题目进行一下解释,之所以取这个名字,是为了与前面三篇文章相对

应,连成一个系列,这里不仅仅涉及使用CCS进行DSP编程,主机端的程序便

是用Visual C++实现的。通信包括许多手段:中断、mailbox、直接数据传输等

等,这里并不一一列举。

现在讨论实现Host和DSP通信。假定读者对CCS的使用已经比较了解,并

有了一定的CCS编程经验。如果读者还不太了解,请参阅《使用CCS进行DSP

编程(一)——CCS编程入门》、《使用CCS进行DSP编程(二)——实现FFT》、

《使用CCS进行DSP编程(三)——实现DMA和Interrupt》及其他CCS的学

习文档。

下面用闻亭公司的C6xP板硬件和闻亭公司的PCI仿真器为例,来实现Host

和DSP通信。对于‘C6Xpa板同样有效。

闻亭公司的C6xP板是一款具有PCI接口的高速信号处理EVM板,接口芯

片是AMCC的S5933,兼容PCI Local Bus Revision 2.1协议。PCI接口比较适合

用来进行Host和DSP的高速大数据量数据交换。主机通过HPI接口可直接访问

DSP的所有存储空间,允许主机初始化DSP,可以从主机加载程序。

前面几篇文章所讲的都是从JTAG接口加载程序,这样比较适合于程序的开

发调试,对于实际的系统来说,大部分都是系统自己从EEPROM或Flash加载,

现在我们可以从主机通过应用程序来加载,基于此,许多耗时的算法PC机不能

实时完成的可以由DSP来完成。

这个过程可以这样来描述:PC机执行应用程序,加载算法到DSP端,并将

需要处理的数据传送到DSP,DSP计算完成后将数据传回PC,整个过程由PC

来控制启动、工作、完成,使用起来比较方便。当然,DSP算法还需要首先用仿

真器通过JTAG接口调试好才行。

接下来看看实现这个功能的一个典型系统框图:

在这个框图里,我简化了主机PC执行程序的其他部分,突出了与DSP进行

通信有关的内容。

对任何一个系统,复位状态必须是确定的,这样才有一个确定的前提,对硬

件电路如此,对于软件编程也是如此。因为这里的关于主机与DSP通信是针对

确定物理硬件的(闻亭公司‘C6Xp板和‘C6Xpa板),编程是建立在对应的支

持库上的,未使用闻亭公司‘C6Xp板或‘C6Xpa板的读者可能对一些地方不太

理解,但原理性的地方应该是一致的。

对于PCI插卡与操作系统的关系,我不做过多的说明。闻亭公司‘C6Xp板

和‘C6Xpa板可以看作标准的PCI插卡,“驱动级”有两个文件支持,

(对于NT4.0是)和,我们所关心的是,它提供

了类似于WIN32的API一样的函数接口,用户可以直接在Visual C++和C++

Builder下调用。

在应用程序中,需要包含头文件 evm6xdll.h,在这个头文件中,包含了对以下函

数的定义:

读者可以对比较感兴趣的函数做进一步的了解,这些函数的参数和使用方法在

TI的文档()中有详细的说明,我就不一一说明。顺便说一下,如果

读者同时有几块类似的PCI插卡,可以通过使用不同的板卡索引分别对不同的板

卡进行操作:

对第一块卡,board_index为0,第二块卡,board_index为1,┉┉,对每一块确

定的卡都有相应的操作句柄对应,相互之间互相不影响。

在DSP端的CCS编程中,同样会用到相关的头文件:board.h和pci.h,以

及相关的运行时库为。其中与主机交换信息的函数列表如下:

现在,对我们要使用的硬件和软件资源都已经有了一定的了解,可以开锅造

饭了。对DSP端的程序,读者可以根据自己的需要来编写,我直接采用Chest Nut

先生的程序来做例子,大家使用时可别忘了饮水思源啊^%(&^$%%&(:_:

其中引用的头文件gather.h源文件如下:

程序中首先对使用的硬件进行初始化,接下来进行死循环,DSP端一直读主

机发送的消息,读到后,将0x02000000开始的1024个空间用1来填充。然后向

主机发送消息,继续循环。同步和异步消息的收发有些不同,罗列如下:

#include

本文标签: 使用 进行 函数 程序 文件

更多相关文章

如何解压7z文件?8种方法(WinMac手机网页端)

28天前

7z 文件是一种高效的压缩文件格式&#xff0c;由 7 - Zip 软件开发者所采用。它运用独特的压缩算法&#xff0c;能显著缩小文件体积&#xff0c;便于存储与传输各类数据&#xff0c;像软件安装包

用EXCEL打开TXT文件的办法

28天前

用EXCEL打开TXT文件的办法 欢迎关注啄木鸟手机监控监听软件 用EXCEL打开TXT文件的办法 因为我对文件做了EXCEL兼容处理&#xff0c;所以可以很方便的用EXCEL打开TXT文件,方便您查询资料。客户就是上帝啊。。步

c盘满了怎么清理垃圾而不误删文件?这个方法轻松解决C盘空间不足

28天前

c盘满了怎么清理垃圾而不误删文件&#xff1f;这个方法轻松解决C盘空间不足 亲爱的读者们&#xff0c;今天我们将分享一种高效且安全的方法来解决大家常遇到的C盘空间不足问题。当您的C盘存储空间告急时&#xff0c

阮工的单片机编程经验集:如何做稳定单片机程序与上位机程序防卡顿,js等经验;阮丁远于20250321

27天前

阮工的单片机编程经验集V2.1&#xff1a;如何做稳定单片机程序 ,  阮丁远&#xff1a;通讯协议 可以特定前导码:0xfe, 其他数据区用ascii码表示数字&#xff0c;使数据区的数据字节不可能为

java用浏览器下载文件_JAVA读取文件流,设置浏览器下载或直接预览操作

26天前

最近项目需要在浏览器中通过URL预览图片。但发现浏览器始终默认下载&#xff0c;而不是预览。研究了一下&#xff0c;发现了问题&#xff1a;设置response的Header&#xff0c;注意

download.js 实现txt,js文件等浏览器下载 而不是打开

26天前

现在本人正在做聊天系统&#xff0c;最近支持收发文件&#xff0c;那下载当然是不可避免的 1.第一步想的是open一个窗口下载文件但事实证明显然不合适&#xff0c;现在的浏览器都是会主动拦截弹窗 2.a通过

程序中通过IE或默认的浏览器打开指定的页面

26天前

1、通过调用ShellExecute()来打开网页 示例&#xff1a;CString strUrl_T(" http:www.google.hk");  HINSTANCE hIeResultSh

txt pdf 等浏览器不直接打开下载程序

26天前

$sava_nameuploadfile2014072620140726114913835.txt; header("Content-Type: applicationforce-download"); h

Ubuntn设置程序开机启动 指定浏览器

26天前

setp1&#xff1a;设置jar开机启动&#xff08;非服务启动方式&#xff09; 1、新建启动脚本 auto-start.sh &#xff08;并基于权限命令&#xff1a; sudo c

xp计算机怎么搜素文件,windowsXP系统搜索功能查找文件与文件夹的具体步骤图解...

26天前

使用电脑时常会发生找不到某个文件或文件夹的情况&#xff0c;这时可借助Windows XP的搜索功能进行查找&#xff0c;具体操作如下。 步骤1&#xff1a;打开“我的电脑”窗口&#xff0c;单击工具

遇到u盘文件损坏怎么办

26天前

有时我们会因为操作不当而引起u盘文件损坏,这时候不要慌.给你推荐一个方法. 1.将u盘插到电脑u盘插口中 2.按下键盘的 winx 键 3.选择终端管理员 4.输入以下命令:      ,按回车键,等一会你的u盘就修复好了,注意: 是E

拼助理拼管家小程序无法查砍价记录了怎么办?

26天前

拼助理拼管家小程序无法查砍价记录了怎么办&#xff1f;拼助理拼管家最新下载方式&#xff1b;拼助理拼管家靠谱么&#xff1f;拼助理拼管家怎么查询拼多多砍价记录&#xff1f; 拼多多现在已经关

static修饰的函数只能在本文件中调用,其他文件想调用怎么办?

26天前

一句话总结&#xff1a;static修饰的变量和函数是有可见范围的&#xff0c;一般情况下不要越限处理。 利用可在本文件调用的属性&#xff0c;另加一个函数fun&#xff0c;fun调用该static

使用反汇编工具IDA查看动态库的汇编代码上下文,结合安卓系统生成的Tombstone文件,快速定位安卓app程序底层C++库的崩溃问题

26天前

目录 1、反汇编工具IDA工具介绍 2、产品及问题场景描述 3、查看安卓系统生成的Tombstone文件 4、使用IDA打开.so动态库文件,查看汇编代码的上下文,到C++源码中定位发生崩溃的那行代码 4.1、使用IDA打开.so

从Linux服务器下载文件到window本地电脑

25天前

1. 用sz命令 如果通过xshell连接到服务器&#xff0c;且为SSH方式&#xff0c;则可以用sz命令&#xff0c;直接在Linux的提示符下操作。 sz <文件路径……文件名> 此方法

Windows系统缺少找不到libusb0.dll文件的解决办法

25天前

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题&#xff0c;如果是新手第一时间会认为是软件或游戏出错了&#xff0c;其实并不是这样&#xff0c;其主要原因就是你电脑系统的该dll文件丢失了或没有安装一

Win11:系统属性,由于启动计算机时出现了页面文件配置问题,Windows 在你的计算机上创建了一个临时页面文件。

25天前

Win11&#xff1a;系统属性&#xff0c;由于启动计算机时出现了页面文件配置问题&#xff0c;Windows 在你的计算机上创建了一个临时页面文件。所有磁盘驱动器的总页面文件大小可能稍大于你所指定的大小。确

64位系统下注册32位dll文件

25天前

在64位系统里注册32位软件所需的一些dll会提示不兼容&#xff0c;大概因为32 位进程不能加载64位Dll&#xff0c;64位进程也不可以加载32的导致。 若要支持的32 位和64 位COM 注册和程序共存状态&am

关于Qt程序不兼容xp系统的问题

24天前

问题 我的程序要跑xp系统.但是5.8打包后的程序不支持xp系统.遂开始了我的修复这个问题的生涯. 过程 用过vs2015qt5.8的办法,qt5.8写好之后用vs2015编译,其中子系统需要改成5.01.还有平台集改成xp的这个

U盘报错,无法复制文件和文件消失

24天前

U盘报错&#xff0c;无法复制文件和文件消失 一、U盘无法复制&#xff0c;如图的情况。二、U盘内容不见了 一、U盘无法复制&#xff0c;如图的情况。 一般来说应该是U盘受到损伤&#xff0c;或者病

发表评论

全部评论 0
暂无评论