ZF_20160717

天梯赛
LV2-008
Manacher算法

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
namespace Mana
{
    int a[2010],b[2020];
    int go(char s[])
    {
        int len=strlen(s+1);
        a[0]=999;
        memset(b,0,sizeof b);
        for(int i=1;i<=len*2;i++)a[i]=i&1?1000:s[i/2];
        a[len*2+1]=1000;
        a[len*2+2]=1001;
        int lim=0,id=0,ret=0;
        for(int i=1;i<=len*2+1;i++)
        {
            if(lim>i)b[i]=min(b[2*id-i],lim-i);
            else b[i]=1;
            while(a[i-b[i]]==a[i+b[i]])b[i]++;
            ret=max(ret,b[i]-1);
            if(i+b[i])lim=i+b[i],id=i;
        }
        return ret;
    }
}
char c[1010];
int main()
{
    while(gets(c+1))
        printf("%d\n",Mana::go(c));
}
*** Using Compiler 'V6.7', folder: 'E:\STM32\keil5\ARM\ARMCLANG\Bin' Build target 'nor_sdram_zf_dtcm' compiling zf_common_vector.c... compiling zf_common_function.c... compiling zf_common_interrupt.c... compiling zf_driver_adc.c... compiling zf_driver_csi.c... compiling zf_driver_delay.c... compiling zf_common_clock.c... compiling zf_common_debug.c... compiling zf_driver_encoder.c... compiling zf_common_fifo.c... compiling zf_common_font.c... compiling isr.c... compiling main.c... compiling zf_driver_flash.c... compiling zf_driver_exti.c... compiling zf_driver_gpio.c... compiling zf_driver_flexio_csi.c... compiling zf_driver_pit.c... compiling zf_driver_pwm.c... compiling zf_driver_iic.c... compiling zf_driver_romapi.c... compiling zf_driver_soft_iic.c... compiling zf_driver_sdio.c... compiling zf_driver_soft_spi.c... compiling zf_driver_timer.c... compiling zf_driver_spi.c... compiling zf_device_bluetooth_ch9141.c... compiling zf_driver_usb_cdc.c... compiling zf_device_absolute_encoder.c... compiling zf_driver_uart.c... compiling zf_device_camera.c... compiling zf_device_icm20602.c... compiling zf_device_imu963ra.c... compiling zf_device_imu660ra.c... compiling zf_device_key.c... compiling zf_device_ips114.c... compiling zf_device_mpu6050.c... compiling zf_device_mt9v03x.c... compiling zf_device_ips200.c... compiling zf_device_mt9v03x_flexio.c... compiling zf_device_oled.c... compiling zf_device_ov7725.c... compiling zf_device_scc8660_flexio.c... compiling zf_device_scc8660.c... compiling zf_device_type.c... compiling zf_device_virtual_oscilloscope.c... compiling zf_device_tsl1401.c... compiling zf_device_tft180.c... compiling zf_device_wifi_uart.c... compiling zf_device_wireless_uart.c... compiling zf_device_dl1a.c... compiling zf_device_dl1b.c... compiling zf_device_wifi_spi.c... compiling zf_device_gnss.c... compiling fsl_aipstz.c... compiling fsl_adc.c... compiling zf_device_ble6a20.c... compiling fsl_adc_etc.c... compiling seekfree_assistant.c... compiling see
最新发布
11-05
<think>我们正在讨论使用编译器V6.7(可能是ARM Compiler version 6.7)来编译STM32项目,该项目包含众多源文件。编译过程中可能会遇到一些常见问题,例如编译速度慢、内存不足、配置错误等。以下将针对这些潜在问题提供相关信息及解决方案。 ### 1. **编译速度慢** 当项目源文件众多时,编译时间可能会显著增加。以下是一些优化建议: - **启用并行编译**:使用`-jN`选项(其中N是并行任务数)来加速编译。例如,在Keil MDK中,可以在Options for Target -> Output -> Browse Information设置中启用并行编译,或者通过命令行参数指定。 - **使用预编译头文件**:将常用的头文件预编译,减少重复解析时间。在ARM Compiler 6中,可以使用`--preinclude`选项或创建预编译头文件(PCH)[^1]。 - **增量编译**:确保启用增量编译,仅编译修改过的文件。在Keil MDK中,默认情况下增量编译是启用的,但需要确认。 - **避免不必要的头文件包含**:检查并减少头文件的嵌套包含,使用前向声明代替包含头文件。 ### 2. **内存不足** 编译大型项目时,可能会遇到内存不足的问题,导致编译失败。解决方案包括: - **增加系统内存**:物理内存(RAM)不足时,考虑增加内存。 - **调整编译器设置**:减少优化级别(如使用`-O1`代替`-O3`),因为高级优化需要更多内存。 - **分段编译**:将项目分成几个子模块分别编译,然后链接。 - **使用64位工具链**:确保使用64位版本的编译器,以支持更大的地址空间。 ### 3. **编译器版本兼容性问题** 使用V6.7编译器时,可能会遇到与旧版本代码的兼容性问题: - **C语言标准**:ARM Compiler 6默认使用C11标准,而旧项目可能基于C89/C90。在Keil MDK中,可以在Options for Target -> C/C++(AC6) -> Language C中选择合适的标准(例如`--c99`)[^2]。 - **内联汇编语法**:ARM Compiler 6(Clang-based)的内联汇编语法与ARMCC5不同。需要按照新的语法规则重写内联汇编代码,或使用单独的汇编文件。 - **链接脚本兼容性**:检查链接脚本(.sct文件)是否兼容。ARM Compiler 6使用Clang的链接器,可能需要调整。 ### 4. **配置错误** 确保项目配置正确: - **包含路径**:确认所有头文件路径已正确设置(Options for Target -> C/C++(AC6) -> Include Paths)。 - **预处理器宏**:正确定义项目所需的宏(如`STM32F103xB`)。 - **启动文件选择**:根据目标芯片选择合适的启动文件(startup_stm32f103c8tx.s),并确保其支持AC6编译器(通常启动文件有不同版本,如`startup_stm32f103xb.s`和`startup_stm32f103xb_ac6.s`,后者针对AC6)。 - **优化选项**:根据需求设置优化级别(-O0, -O1, -O2, -O3, -Oz)。调试时建议使用-O0。 ### 5. **编译器特定选项** ARM Compiler 6(AC6)与之前的ARM Compiler 5(AC5)有较大差异,需要注意: - **使用MicroLib**:在低内存设备上,可以在Options for Target -> Target -> Use MicroLIB中勾选,以减小代码大小。 - **链接后优化**:使用`--lto`(链接时优化)选项,但注意这可能会增加链接时间和内存消耗。 - **浮点运算**:对于带FPU的芯片(如STM32F4),确保启用FPU并设置正确的浮点ABI(Options for Target -> C/C++(AC6) -> Floating Point Hardware -> FPv4-SP-D16 for single precision, or FPv5 for double)[^3]。 ### 6. **错误处理** 编译过程中可能出现的错误及解决: - **未定义符号**:检查是否遗漏源文件或库,链接脚本是否包含所需内存区域。 - **段溢出**:调整链接脚本中的堆栈大小或内存分配,或优化代码减少体积。 - **警告视为错误**:如果项目设置了`--warnings_are_errors`,需解决所有警告或取消此设置。 ### 示例配置(Keil MDK) 在Keil MDK中配置AC6编译器的一般步骤: 1. 打开Options for Target对话框。 2. 切换到Target选项卡,选择ARM Compiler Version 6。 3. 在C/C++(AC6)选项卡中设置优化级别、包含路径、预处理器宏等。 4. 在Asm选项卡中设置汇编器选项(如果有汇编文件)。 5. 在Linker选项卡中设置链接脚本(.sct文件)和分散加载文件(如果需要)。 6. 在Output选项卡中配置输出文件(如HEX文件)和调试信息。 ### 总结 使用ARM Compiler 6.7编译大型STM32项目时,重点关注编译速度、内存使用、兼容性配置和错误处理。合理配置编译选项和优化项目结构,可以有效解决大多数问题。如果具体问题仍无法解决,建议查阅ARM Compiler 6官方文档或Keil MDK用户手册。 §§相关问题§§ 1. 如何优化ARM Compiler 6的编译速度? 2. ARM Compiler 6与ARM Compiler 5的主要区别是什么? 3. 在Keil MDK中如何配置ARM Compiler 6的浮点运算选项? 4. 如何处理编译过程中的内存不足错误? 5. 如何解决ARM Compiler 6中的内联汇编兼容性问题? [^1]: ARM Compiler User Guide, Chapter 4: Compiler-specific Features. [^2]: Keil MDK Help: Using ARM Compiler 6. [^3]: STM32CubeMX User Manual, Section 6.3: Toolchain/IDE Settings. </think>### 使用编译器 V6.7 编译 STM32 多源文件的常见问题及解决方案 #### 1. **编译速度过慢问题** - **原因**:项目源文件过多时,编译器需逐文件解析,尤其在启用高优化级别(如 `-O3`)时更明显。 - **解决方案**: - **启用并行编译**:在 Keil MDK 中通过 `Options for Target → Output → Enable Parallel Build` 开启并行编译(`-jN`,`N` 为线程数)[^1]。 - **预编译头文件(PCH)**:将频繁引用的头文件(如 `stm32f1xx.h`)预编译为 `.pch` 文件,减少重复解析时间。 ```c // 示例:在编译器选项中添加 --preinclude=core.pch ``` - **增量编译**:仅重新编译修改过的文件(Keil 默认支持)。 #### 2. **内存不足导致编译中断** - **原因**:V6.7 编译器进行高级优化时可能占用大量内存,源文件过多易触发系统内存限制。 - **解决方案**: - **优化编译器配置**: - 降低优化级别(如从 `-O3` 改为 `-O1`)。 - 关闭冗余功能(如 `--no_debug` 移除调试符号)。 - **分段编译**:将项目拆分为多个子模块(Lib 库),分别编译后链接。 - **升级工具链**:使用 64 位版本编译器(如 ARM Compiler 6.18)支持更大内存寻址[^2]。 #### 3. **源文件依赖管理错误** - **现象**:头文件修改后,依赖文件未重新编译,导致逻辑错误。 - **解决方案**: - **完善 Makefile 依赖规则**:使用 `gcc -M` 自动生成头文件依赖关系。 ```makefile %.d: %.c gcc -MM $< -o $@ include $(SRCS:.c=.d) // 包含所有依赖规则 ``` - **IDE 配置**:在 Keil 中勾选 `Options for Target → Output → Generate Makefile automatically`。 #### 4. **编译器版本兼容性问题** - **现象**:旧工程迁移到 V6.7 后出现语法报错(如内联汇编不兼容)。 - **解决方案**: - **语法适配**: - ARM Compiler V6 使用 Clang 语法,需重写 ARMCC5 风格的内联汇编。 ```c // V6.7 兼容格式示例 __asm volatile ("MOV R0, #0x10"); ``` - **启动文件适配**:替换为支持 AC6 的启动文件(如 `startup_stm32f103xb.s` 而非 `startup_stm32f10x_md.s`)[^2]。 #### 5. **优化引发的异常行为** - **现象**:开启高优化后程序逻辑异常(如时序错误、变量被优化)。 - **解决方案**: - **关键代码防优化**:用 `volatile` 修饰硬件相关变量。 - **局部禁用优化**: ```c #pragma clang optimize off // 关闭优化 void CriticalFunction() { ... } #pragma clang optimize on ``` - **链接时优化(LTO)**:在 `Options for Target → C/C++ → Enable Link-Time Optimization` 中谨慎启用。 #### 6. **分散加载配置错误** - **现象**:多源文件编译后,部分代码未正确链接到指定内存区域。 - **解决方案**: - **自定义分散加载文件(.scat)**:明确指定代码/数据地址。 ```scatter LR_IROM1 0x08000000 0x10000 { // Flash 区域 ER_IROM1 0x08000000 0x10000 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x5000 { // RAM 区域 .ANY (+RW +ZI) } } ``` ### 最佳实践建议 1. **模块化编译**:将驱动、算法、应用层拆分为静态库(`.a` 或 `.lib`),分步编译链接。 2. **持续集成**:使用 Jenkins 或 GitLab CI 自动编译,并通过 `--error_limit=10` 限制单次错误数量。 3. **内存映射分析**:编译后通过 `arm-none-eabi-size` 工具分析各模块占用,优化资源分配。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值