【问题标题】:Keil C51 tools integrated into Qt CreatorKeil C51 工具集成到 Qt Creator
【发布时间】:2018-09-18 06:32:51
【问题描述】:

我喜欢 Qt Creator 开发环境,现在需要使用 Keil C51 编译器/工具编译一些 C 代码。

是否可以将 Qt Creator IDE 与 Keil C51 工具一起使用?有人可以详细描述如何设置吗?

OR - 是不是另一个可以与 Qt Creator 集成的 8052 芯片编译器?

【问题讨论】:

    标签: qt-creator keil


    【解决方案1】:

    现在,可以将 QtCreator 与 Qbs 一起使用(从 1.15 开始)。此外,还可以将 VSCode 与 Qbs 扩展一起使用。

    【讨论】:

      【解决方案2】:

      我可以确认,我可以将 QT 与 C51 一起使用。

      环境

      我使用 QT 作为编辑器。 和 Keil C51 作为编译器。我用纯 C(不是 C++)为 STC 微控制器编写了一个程序。

      TLDR

      我使用 Windows 批处理文件编译工作目录中的所有 *.c 文件,然后将它们链接到一个 hex 文件中。然后我设置 QT(项目 -> 构建设置 -> 构建步骤 -> 自定义)以在构建阶段使用此批处理(不要忘记正确设置工作目录)。

      如何获取需要的批处理文件

      简单的方法

      Keil 可以为特定项目生成一个批处理(参见项目->目标选项->输出->创建批处理文件)。然后如上所述在 QT 中使用此文件。

      这种方式的主要缺陷是 - 当您更改项目配置或向项目添加新文件时,您需要从 Keil 重新生成 Batch。

      更好的方法

      使用 Keil 生成的 Batch,我编写了自己的 Bath,没有上述缺陷。

      更好的方法

      我想使用 Makefile 比 Batch 更好,因为它为 QT 提供了更多控制和有关编译期间错误的信息。但我现在没有“现成”示例。

      批处理文件说明

      简而言之,这批:

      1. 设置设置和目录
      2. 为工作目录中的每个 *.c 文件调用编译器
      3. 构建*.obj 列表并调用链接器以获取二进制格式的固件映像
      4. 将获取的图片转换为HEX格式

      列表:

      REM "Folders"
      SET C51FLDR=d:\Keil\C51
      SET OUTFLDR=.\Objects
      SET LSTFLDR=.\Listings
      SET HEXNAME=PREP_FIRMWARE
      
      SET C51INC=%C51FLDR%\Inc;%C51FLDR%\Inc\STC
      SET C51LIB=%C51FLDR%\Lib
      
      REM "Variables"
      SET C51EXE=%C51FLDR%\BIN\C51.EXE
      SET C51LNK=%C51FLDR%\BIN\BL51.EXE
      SET C51HEX=%C51FLDR%\BIN\OH51.EXE
      set OBJLIST=
      
      REM "Defines"
      SET CPU_TYPE=STC15W408S
      SET CPU_VENDOR=STC
      SET UV2_TARGET=Target 1
      SET CPU_XTAL=0x02160EC0
      SET SETTINGS="COMPACT ROM(COMPACT) OPTIMIZE (9,SIZE) BROWSE DEBUG OBJECTEXTEND LISTINCLUDE SYMBOLS TABS (2)"
      
      
      echo ===================== Compile =====================
      for %%f in (*.c) do (
      echo %errorlevel%
      setlocal EnableDelayedExpansion
      %C51EXE% %%f  %SETTINGS% "PRINT(%LSTFLDR%\%%~nf.lst) OBJECT(%OUTFLDR%\%%~nf.obj)"
      if !errorlevel! neq 0 exit /b !errorlevel!
      )
      
      echo ===================== Link =====================
      call :obj_list
      echo %OBJLIST%
      %C51LNK%  %OBJLIST% TO "%OUTFLDR%\%HEXNAME%" PRINT("%LSTFLDR%\%HEXNAME%.m51") RAMSIZE(256) 
      echo %errorlevel%
      if %errorlevel% GTR 1 exit /b %errorlevel%
      
      echo ===================== Hex =====================
      %C51HEX% "%OUTFLDR%\%HEXNAME%" 
      if %errorlevel% neq 0 exit /b %errorlevel%
      
      echo ==========================================
      echo Build Success
      echo ==========================================
      goto :eof
      
      :obj_list
      for %%f in (.\Objects\*.obj) DO call :concat %%f
      set OBJLIST=%OBJLIST:~0,-1%
      goto :eof
      
      :concat
      set OBJLIST=%OBJLIST%"%1",
      goto :eof
      

      【讨论】: