dsp 28377在线升级 实例总结
使用dsp品台28377d来实现在线升级的功能。
方案 : 升级程序 + 应用程序
升级程序 : 主要的目的是将上位机发送过来的应用程序数据(ccs编译生成的.bin文件)烧写到指定位置,之后在跳转到应用程序执行。
应用程序 : 等待升级的程序
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
升级代码段 :
flash_programming_cpu01.c
//#########################################################################
// FILE: flash_programming_cpu01.c
// TITLE: Flash Programming Example for F2837xD.
//
//! \addtogroup dual_example_list
//! <h1> Flash Programming </h1>
//!
//! This example demonstrates F021 Flash API usage.
//
//#########################################################################
// $TI Release: F2837xD Support Library v170 $
// $Release Date: Mon Sep 21 16:52:10 CDT 2015 $
// $Copyright: Copyright (C) 2013-2015 Texas Instruments Incorporated -
// http://www.ti.com/ ALL RIGHTS RESERVED $
//######################################################################### #include "F28x_Project.h" // Device Headerfile and Examples Include<span style="white-space:pre"> </span>File
#include "F2837xD_Ipc_drivers.h" #include <string.h> //Include Flash API example header file
#include "flash_programming_c28.h" #define ENTRYADDR 0x88000 extern void lightflash(void); //*************************************************************************
// FILE Flash API include file
//*************************************************************************
#include "F021_F2837xD_C28x.h" //Data/Program Buffer used for testing the flash API functions
#define WORDS_IN_FLASH_BUFFER 3608 // Programming data buffer, words uint16 Buffer[WORDS_IN_FLASH_BUFFER + ];
uint32 *Buffer32 = (uint32 *)Buffer; #pragma DATA_SECTION(pbuffer , "PDATASAVE");
uint16 pbuffer[WORDS_IN_FLASH_BUFFER]= {
#include "P_DATA.h"
}; //*************************************************************************
// Prototype of the functions used in this example
//*************************************************************************
void Example_CallFlashAPI(void); //*************************************************************************
// This is an example code demonstrating F021 Flash API usage.
// This code is in Flash
//*************************************************************************
void main(void)
{
// Step 1. Initialize System Control:
// Enable Peripheral Clocks
// This example function is found in the F2837xD_SysCtrl.c file.
InitSysCtrl(); IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH); InitGpio(); InitPieCtrl(); IER = 0x0000;
IFR = 0x0000; InitPieVectTable(); EINT; // Enable Global interrupt INTM // Jump to RAM and call the Flash API functions
Example_CallFlashAPI(); DELAY_US(); static void (*APPEntry)(void); APPEntry = (void (*)(void))(ENTRYADDR); ESTOP0; (*APPEntry)(); while(); } //*************************************************************************
// Example_CallFlashAPI
//
// This function will interface to the flash API.
// Flash API functions used in this function are executed from RAM
//*************************************************************************
#pragma CODE_SECTION(Example_CallFlashAPI , "ramfuncs");
void Example_CallFlashAPI(void)
{
uint32 u32Index = ;
uint16 i = ; Fapi_StatusType oReturnCheck;
volatile Fapi_FlashStatusType oFlashStatus; // Gain pump semaphore
SeizeFlashPump(); EALLOW;
Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0x0;
EDIS; EALLOW; oReturnCheck = Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, );//for now keeping it out if(oReturnCheck != Fapi_Status_Success)
{
// Check Flash API documentation for possible errors
while();
} oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);
if(oReturnCheck != Fapi_Status_Success)
{
// Check Flash API documentation for possible errors
while();
} oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,
(uint32 *)ENTRYADDR); while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){} // In this case just fill a buffer with data to program into the flash.
for(i=, u32Index = ENTRYADDR; (u32Index < (ENTRYADDR + WORDS_IN_FLASH_BUFFER))&& (oReturnCheck ==Fapi_Status_Success); i=i+, u32Index = u32Index + )
{
oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)u32Index,&pbuffer[i],
,
,
,
Fapi_DataOnly); while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy); if(oReturnCheck != Fapi_Status_Success)
{
// Check Flash API documentation for possible errors
while();
} // Read FMSTAT register contents to know the status of FSM after
// program command for any debug
oFlashStatus = Fapi_getFsmStatus();
} // Leave control over flash pump
ReleaseFlashPump();
}
第98行的函数 :
void Example_CallFlashAPI(void)
将数据烧写到地址为0x88000地址为首地址的flash内存当中。并且函数在ramfunc中运行,ramfunc和首地址的跳转在cmd文件中有体现
2837xD_FLASH_lnk_cpu1.cmd MEMORY
{
PAGE : /* Program Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE1 for dataallocation */
/* BEGIN is used for the "boot to Flash" bootloader mode */ BEGIN : origin = 0x080000, length = 0x000002
RAMM0 : origin = 0x000122, length = 0x0002DE
RAMD0 : origin = 0x00B000, length = 0x000800
RAMLS0 : origin = 0x008000, length = 0x000800
RAMLS1 : origin = 0x008800, length = 0x000800
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800
RAMGS14 : origin = 0x01A000, length = 0x001000
RAMGS15 : origin = 0x01B000, length = 0x001000
RESET : origin = 0x3FFFC0, length = 0x000002 /* Flash sectors */
FLASHA : origin = 0x080002, length = 0x001FFE /* on-chipFlash */
FLASHB : origin = 0x082000, length = 0x002000 /* on-chipFlash */
FLASHC : origin = 0x084000, length = 0x002000 /* on-chipFlash */
FLASHD : origin = 0x086000, length = 0x002000 /* on-chipFlash */
FLASHE : origin = 0x088000, length = 0x008000 /* on-chipFlash */
FLASHF : origin = 0x090000, length = 0x008000 /* on-chipFlash */
FLASHG : origin = 0x098000, length = 0x008000 /* on-chipFlash */
FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chipFlash */
FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chipFlash */
FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chipFlash */
FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chipFlash */
FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chipFlash */
FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chipFlash */
FLASHN : origin = 0x0BE000, length = 0x002000 /* on-chipFlash */ PAGE : /* Data Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE0 for programallocation */ BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part ofM0, BOOT rom will use this for stack */
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chipRAM block M1 */
RAMD1 : origin = 0x00B800, length = 0x000800 RAMLS5 : origin = 0x00A800, length = 0x000800 RAMGS0 : origin = 0x00C000, length = 0x001000
RAMGS1 : origin = 0x00D000, length = 0x001000
RAMGS2 : origin = 0x00E000, length = 0x001000
RAMGS3 : origin = 0x00F000, length = 0x001000
RAMGS4 : origin = 0x010000, length = 0x001000
RAMGS5 : origin = 0x011000, length = 0x001000
RAMGS6 : origin = 0x012000, length = 0x001000
RAMGS7 : origin = 0x013000, length = 0x001000
RAMGS8 : origin = 0x014000, length = 0x001000
RAMGS9 : origin = 0x015000, length = 0x001000
RAMGS10 : origin = 0x016000, length = 0x001000
RAMGS11 : origin = 0x017000, length = 0x001000
RAMGS12 : origin = 0x018000, length = 0x001000
RAMGS13 : origin = 0x019000, length = 0x001000 CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400
CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400
} SECTIONS
{
/* Allocate program areas: */
.cinit : > FLASHB PAGE = , ALIGN()
.pinit : > FLASHB, PAGE = , ALIGN()
.text : >> FLASHB | FLASHC | FLASHD PAGE = ,ALIGN()
codestart : > BEGIN PAGE = , ALIGN()
ramfuncs : LOAD = FLASHD,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = , ALIGN() /* Allocate uninitalized data sections: */
.stack : > RAMM1 PAGE =
.ebss : >> RAMLS5 | RAMGS0 | RAMGS1 PAGE =
.esysmem : > RAMLS5 PAGE = /* Initalized sections go in Flash */
.econst : >> FLASHF | FLASHG | FLASHH PAGE = ,ALIGN()
.switch : > FLASHB PAGE = , ALIGN() .reset : > RESET, PAGE = , TYPE = DSECT /* not used,*/ Filter_RegsFile : > RAMGS0, PAGE = SHARERAMGS0 : > RAMGS0, PAGE =
SHARERAMGS1 : > RAMGS1, PAGE =
ramgs0 : > RAMGS0, PAGE =
ramgs1 : > RAMGS1, PAGE = #ifdef __TI_COMPILER_VERSION
#if __TI_COMPILER_VERSION >= 15009000
.TI.ramfunc : {} LOAD = FLASHD,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = , ALIGN()
#endif
#endif /* The following section definitions are required when using the IPC API Drivers */
GROUP : > CPU1TOCPU2RAM, PAGE =
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
} GROUP : > CPU2TOCPU1RAM, PAGE =
{
GETBUFFER : TYPE = DSECT
GETWRITEIDX : TYPE = DSECT
PUTREADIDX : TYPE = DSECT
} /* The following section definition are for SDFM examples */
Filter1_RegsFile : > RAMGS1, PAGE = , fill=0x1111
Filter2_RegsFile : > RAMGS2, PAGE = , fill=0x2222
Filter3_RegsFile : > RAMGS3, PAGE = , fill=0x3333
Filter4_RegsFile : > RAMGS4, PAGE = , fill=0x4444
Difference_RegsFile : >RAMGS5, PAGE = , fill=0x3333
PDATASAVE : > RAMGS0 , PAGE = } /*
141 //=========================================================================
==
142 // End of file.
143 //=========================================================================
==
144 */
应用程序代码如下所示 :
blinky_cpu01.c
//#########################################################################
// FILE: blinky_cpu01.c
// TITLE: LED Blink Example for F2837xD.
//
//! \addtogroup cpu01_example_list
//! <h1> Blinky </h1>
//!
//! This example blinks LED X
//
//#########################################################################
// $TI Release: F2837xD Support Library v180 $
// $Release Date: Fri Nov 6 16:19:46 CST 2015 $
// $Copyright: Copyright (C) 2013-2015 Texas Instruments Incorporated -
// http://www.ti.com/ ALL RIGHTS RESERVED $
//######################################################################### #include "F28x_Project.h" // Device Headerfile and Examples IncludeFile
#include <string.h> Uint16 test = ; //void setup_emif1_pinmux_async_16bit(Uint16 cpu_sel);
//***************************************************************
//usart initial block
//***************************************************************
void UsartInit(void)
{
GPIO_SetupPinMux(, GPIO_MUX_CPU1, );
GPIO_SetupPinOptions(, GPIO_INPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(, GPIO_MUX_CPU1, );
GPIO_SetupPinOptions(, GPIO_OUTPUT, GPIO_ASYNC); //---- USART configuration ----------
SciaRegs.SCIFFTX.all=0xE040;
SciaRegs.SCIFFRX.all=0x2044;
SciaRegs.SCIFFCT.all=0x0; SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =;
SciaRegs.SCICTL2.bit.RXBKINTENA =;
SciaRegs.SCIHBAUD.all =0x0002;
Page 1blinky_cpu01.c
SciaRegs.SCILBAUD.all =0x008B;
// SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset //-DMA configuration
} //***************************************************************
//usart UsartSendData block
//just fit for 8 bit data to send
//***************************************************************
void UsartSendData(uint16_t data_in)
{
SciaRegs.SCITXBUF.all = data_in;
while(SciaRegs.SCIFFTX.bit.TXFFST !=); // wait for RRDY/RXFFST =1 fordata available in FIFO
} void main(void)
{
InitSysCtrl(); InitGpio(); DINT; InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000; InitPieVectTable(); EINT; // Enable Global interrupt INTM UsartInit(); EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = ;
GpioCtrlRegs.GPADIR.bit.GPIO10 = ;
EDIS; GpioDataRegs.GPADAT.bit.GPIO10 = ; while(){ GpioDataRegs.GPADAT.bit.GPIO10 = ; DELAY_US(); GpioDataRegs.GPADAT.bit.GPIO10 = ; DELAY_US(); if(test == ) test = ; test = test + ; UsartSendData(test); DELAY_US();
}
}
应用程序在调试的时候出现了一个问题 :
就是在在线调试的过程中,从升级程序跳转到应用程序的时候:
static void (*APPEntry)(void); APPEntry = (void (*)(void))(ENTRYADDR); ESTOP0; (*APPEntry)();
进入应用程序,应用程序总是会在一些地方跳转到异常中断,最后找问题找到是在应用程序中的IntiFlash()函数,屏蔽掉该函数就正常啦。
IntiFlash()函数是嵌入到InitSysCtrl();中,就是应用程序最开始调用的那个函数。
2837xD_FLASH_lnk_cpu1.cmd MEMORY
{
PAGE : /* Program Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation */
/* BEGIN is used for the "boot to Flash" bootloader mode */ BEGIN : origin = 0x088000, length = 0x000002
RAMM0 : origin = 0x000122, length = 0x0002DE
RAMD0 : origin = 0x00B000, length = 0x000800
RAMLS0 : origin = 0x008000, length = 0x000800
RAMLS1 : origin = 0x008800, length = 0x000800
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800
RAMGS14 : origin = 0x01A000, length = 0x001000
RAMGS15 : origin = 0x01B000, length = 0x001000
RESET : origin = 0x3FFFC0, length = 0x000002 /* Flash sectors */
FLASHA : origin = 0x080002, length = 0x001FFE /* on-chipFlash */
FLASHB : origin = 0x082000, length = 0x002000 /* on-chipFlash */
FLASHC : origin = 0x084000, length = 0x002000 /* on-chipFlash */
FLASHD : origin = 0x086000, length = 0x002000 /* on-chipFlash */
FLASHE : origin = 0x088002, length = 0x007FFE /* on-chipFlash */
FLASHF : origin = 0x090000, length = 0x008000 /* on-chipFlash */
FLASHG : origin = 0x098000, length = 0x008000 /* on-chipFlash */
FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chipFlash */
FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chipFlash */
FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chipFlash */
FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chipFlash */
FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chipFlash */
FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chipFlash */
FLASHN : origin = 0x0BE000, length = 0x002000 /* on-chipFlash */ Page 12837xD_FLASH_lnk_cpu1.cmd
PAGE : /* Data Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE0 for programallocation */ BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part ofM0, BOOT rom will use this for stack */
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chipRAM block M1 */
RAMD1 : origin = 0x00B800, length = 0x000800 RAMLS5 : origin = 0x00A800, length = 0x000800 RAMGS0 : origin = 0x00C000, length = 0x001000
RAMGS1 : origin = 0x00D000, length = 0x001000
RAMGS2 : origin = 0x00E000, length = 0x001000
RAMGS3 : origin = 0x00F000, length = 0x001000
RAMGS4 : origin = 0x010000, length = 0x001000
RAMGS5 : origin = 0x011000, length = 0x001000
RAMGS6 : origin = 0x012000, length = 0x001000
RAMGS7 : origin = 0x013000, length = 0x001000
RAMGS8 : origin = 0x014000, length = 0x001000
RAMGS9 : origin = 0x015000, length = 0x001000
RAMGS10 : origin = 0x016000, length = 0x001000
RAMGS11 : origin = 0x017000, length = 0x001000
RAMGS12 : origin = 0x018000, length = 0x001000
RAMGS13 : origin = 0x019000, length = 0x001000 CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400
CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400
} SECTIONS
{
/* Allocate program areas: */
.cinit : > FLASHE PAGE = , ALIGN()
.pinit : > FLASHE, PAGE = , ALIGN()
.text : >> FLASHE PAGE = , ALIGN()
codestart : > BEGIN PAGE = , ALIGN()
ramfuncs : LOAD = FLASHE,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = , ALIGN() /* Allocate uninitalized data sections: */
.stack : > RAMM1 PAGE =
.ebss : >> RAMLS5 | RAMGS0 | RAMGS1 PAGE =
.esysmem : > RAMLS5 PAGE = /* Initalized sections go in Flash */
.econst : >> FLASHE PAGE = , ALIGN()
.switch : > FLASHE PAGE = , ALIGN() .reset : > RESET, PAGE = , TYPE = DSECT /* not used,*/ Filter_RegsFile : > RAMGS0, PAGE = SHARERAMGS0 : > RAMGS0, PAGE =
SHARERAMGS1 : > RAMGS1, PAGE =
ramgs0 : > RAMGS0, PAGE =
ramgs1 : > RAMGS1, PAGE = #ifdef __TI_COMPILER_VERSION
#if __TI_COMPILER_VERSION >= 15009000
.TI.ramfunc : {} LOAD = FLASHE,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = , ALIGN()
#endif
#endif /* The following section definitions are required when using the IPC APIDrivers */
GROUP : > CPU1TOCPU2RAM, PAGE =
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
} GROUP : > CPU2TOCPU1RAM, PAGE =
{
GETBUFFER : TYPE = DSECT
GETWRITEIDX : TYPE = DSECT
PUTREADIDX : TYPE = DSECT
} /* The following section definition are for SDFM examples */
Filter1_RegsFile : > RAMGS1, PAGE = , fill=0x1111
Filter2_RegsFile : > RAMGS2, PAGE = , fill=0x2222
Filter3_RegsFile : > RAMGS3, PAGE = , fill=0x3333
Filter4_RegsFile : > RAMGS4, PAGE = , fill=0x4444
Difference_RegsFile : >RAMGS5, PAGE = , fill=0x3333 } /*
140 //=========================================================================
==
141 // End of file.
142 //=========================================================================
==
143 */
升级程序完成,可用
dsp 28377在线升级 实例总结的更多相关文章
- 关于DSP的boot mode / boot loader /上电顺序 /在线升级等问题的总结
使用器件 ti dsp c2000 2837x 1.dsp的上电过程和boot mode以及boot loader 1)dsp的上电顺序, 对于双核系统而言 , 他的上电启动顺序如下所示: 系统复位或 ...
- 自学Linux Shell9.3-基于Red Hat系统工具包:RPM属性依赖的解决方式-YUM在线升级
点击返回 自学Linux命令行与Shell脚本之路 9.3-基于Red Hat系统工具包:RPM属性依赖的解决方式-YUM在线升级 本节主要介绍基于Red Had的系统(测试系统centos) yum ...
- C#做的在线升级小程序
转自原文C#做的在线升级小程序 日前收到一个小任务,要做一个通用的在线升级程序.更新的内容包括一些dll或exe或.配置文件.升级的大致流程是这样的,从服务器获取一个更新的配置文件,经过核对后如有新的 ...
- 【WCF】基于WCF的在线升级
一.前言 前不久因公司产品需要完成了在线升级功能,因为编程技术不精,不敢冒然采用Socket方法实现在线升级,所以使用比较方便稳妥的WCF方式 如果考虑并发能力的话还是Socket> ...
- Encrypting bootloader (程序BIN文件加密及在线升级)
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...
- 【Remoting】.Net remoting方法实现简单的在线升级(上篇:更新文件)
一.前言: 最近做一个简单的在线升级Demo,使用了微软较早的.Net Remoting技术来练手. 简单的思路就是在服务器配置一个Remoting对象,然后在客户端来执行Remoting ...
- android 在线升级借助开源中国App源码
android 在线升级借助开源中国App源码 http://www.cnblogs.com/luomingui/p/3949429.html android 在线升级借助开源中国App源码分析如下: ...
- 利用mtd工具实现嵌入式设备在线升级
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 主要思路是:通过web post方式将升级文件交给CGI程序处理,然后通过mtd工具实现设备在线升级. 1.页面部分 & ...
- word文档标题级别批量更改——批量降级与升级实例
word文档标题级别批量更改——批量降级与升级实例 word文档标题级别批量更改——批量降级实例 2012年12月21日16:30:44 现有一个3级文档结构的word文档,如下图所示 先需要将上 ...
随机推荐
- 如何让tomcat不记录catalina.out这个日志文件
tomcat日志记录配置在conf/logging.properties中 有这5类日志 catalina,localhost,manager,admin(控制台),host-manager 还有8个 ...
- spark 基本操作
读取文件的数据 使用的数据:https://codeload.github.com/xsankar/fdps-v3/zip/master 读取单个文件的数据 case class Employee(E ...
- UE4入门与精通
由于目前在使用UE4引擎,多少也有一些心得,比如在日常使用中会遇到一些问题.坑(潜规则)或者一些使用技巧等.本人决定开一个大坑,主要有两个目的:一是可以自己做个记录,二是可以给大家提供一些参考吧.主要 ...
- ubuntu 15.04 安装配置 JDK1.8
1.到oracle的官网下载 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 选 ...
- html5开发移动页面去掉点击出现的透明阴影----&&-----元素垂直居中
[摘要:做好的页里正在脚机端测试时,发明局部扫瞄器,tap后会涌现一个半通明的灰色配景,(被批...),起先认为是outline作祟,减上后发明出反映,末了发明是tap后的配景下明,要重设那个] ...
- Java多线程线程学习(一)
一.操作系统级别的进程与线程1.进程: 一个计算机程序的运行实例.包含了需要执行的指令,有自己的独立地址空间,是互相隔离的.进程拥有各种资源和状态信息,包括打开的文件.子进程和信号处理.2.线程: 表 ...
- 3.Git的诞生和其分布式的优点
Git的诞生 省略了,喜欢的可以看百度. 分布式的优点 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完 ...
- python 查找指定内容的txt文件
程序设计思路:1. 利用os.walk()找出所有的文件;2.利用正则找到指定后缀的文件:3.找到需要的txt文件后,通过open().readlines()读取文件中每行数据;4.读取后,保存正则匹 ...
- C++11特性(模板类 initializer_list)
[1]initializer_list模板类 C++primer 原文如下: 通读原文相关篇幅,分析解读内容如下: 提供initializer_list类的初衷,为了便于将有限个同一类型(或可转换为同 ...
- AC6102 开发板千兆以太网UDP传输实验
AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器 ...