根據Keil項目文件修改成tiny的Makefile

淺談STM32CubeIDE

前面文章有寫,我上手時採用了IDE,但後來實踐中,我再也沒打開過STM32CubeIDE,原因比較多吧,

  • 啓動太臃腫
  • 配置複雜
  • 電腦配置差
  • 用着不爽
  • ……

當然後兩點純粹個人原因 哈哈

實際學習中,我基本上是採用的gcc+sublime text或者gcc+vim。因爲我習慣這麼用了,雖然用着談不上方便,但是順手。

我的感受

可是,開始上手時,對於源碼的不瞭解,加之GCC下只有一個HelloWorld,讓我對TencentOS-tiny的探索之旅無所適從。所以,爲了後人乘涼,我乾脆就把我編寫好的Makefile文件和當時修改文件的思路拿出來分享給大家。

修改方法

標準Makefile的樣子

首先,我們先看看標準Makefile到底長啥樣子,這裏,我們打開board/TencentOS_tiny_EVB_MX/GCC/hello_world/Makefile文件,分析一下里面的結構,就發現其實大部分地方不需要改動,我們只用將我們的examples需要編譯的c文件,以及需要包含的頭文件包含進去就可以了。

所以,找到待編譯的文件,還有頭文件,就是我們的目標。

尋找目標Keil文件

現在轉戰到KEIL目錄下,我們以farm_ai_demo文件爲例,使用文本編輯器打開board/TencentOS_tiny_EVB_MX/KEIL/farm_ai_demo/TencentOS_tiny.uvprojx 文件,就可以看到裏面的文件結構,大致瀏覽一下,發現這就是個xml文件。

頭文件

接下來就發現,我們的目標就靜靜的躺在那裏,等待我們的到來:
在這裏插入圖片描述

就在<IncludePath>標籤之中,所有的頭文件包含都在這裏了。我們把這段複製出來,進行處理一下:

先將Windows下的路徑分隔符\轉換爲/,然後使用換行替換掉;

再將../轉換爲對應的路徑,這樣,就可以把這段代碼添加到Makefile文件的頭文件包含段了。我們對他們再進行一些模塊劃分,最終頭文件包含的效果就是這樣:

# C includes
KERNEL_INC = \
		-I $(TOP_DIR)/kernel/core/include  \
		-I $(TOP_DIR)/kernel/pm/include  \
		-I $(TOP_DIR)/kernel/hal/include \
		-I $(TOP_DIR)/arch/arm/arm-v7m/common/include \
		-I $(TOP_DIR)/arch/arm/arm-v7m/cortex-m4/gcc
		C_INCLUDES += $(KERNEL_INC)

CMSIS_INC = \
		-I $(TOP_DIR)/osal/cmsis_os
		C_INCLUDES += $(CMSIS_INC)

PLATFORM_INC = \
		-I $(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Inc \
		-I $(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Inc/Legacy \
		-I $(TOP_DIR)/platform/vendor_bsp/st/CMSIS/Device/ST/STM32L4xx/Include \
		-I $(TOP_DIR)/platform/vendor_bsp/st/CMSIS/Include
		C_INCLUDES += $(PLATFORM_INC)

BOARD_INC =  \
		-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/TOS-CONFIG \
		-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Inc \
		-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/DHT11 \
		-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/BH1750 \
		-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/E53_IA1 \
		-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/OLED
		C_INCLUDES += $(BOARD_INC)

NET_INC = \
		-I $(TOP_DIR)/net/at/include \
		-I $(TOP_DIR)/net/sal_module_wrapper \
		-I $(TOP_DIR)/devices/esp8266
		C_INCLUDES += $(NET_INC)

COMPONENTS_INC = \
		-I $(TOP_DIR)/components/utils/JSON/include \
		-I $(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/wrapper/include \
		-I $(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/include
		C_INCLUDES += $(COMPONENTS_INC)

EXAMPLES_INC = \
		-I $(TOP_DIR)/examples/farm_ai_demo
		C_INCLUDES += $(EXAMPLES_INC)

源碼文件

有了頭文件的經驗,我們繼續尋找源碼,
在這裏插入圖片描述

不過,跟剛纔的頭文件稍有不同,這裏每個源碼都是單獨的標籤,不再擁擠在一起,而且,路徑也單獨標識出來,看着好像不太好搞。不過,沒關係,這點根本難不倒讀文章到這裏的你:

複製所有的FilePath標籤行到新文件,替換掉標籤,並且把Windows下的路徑分隔符\轉換爲/,操作跟之前都相似。

最終,我們得到了一個個熱氣騰騰的源碼文件列表,把他們稍加分類,添加到我們的Makefile中:

# C sources
KERNEL_SRC =  \
		${wildcard $(TOP_DIR)/kernel/core/*.c}
		C_SOURCES += $(KERNEL_SRC)

ARCH_SRC =  \
		${wildcard $(TOP_DIR)/arch/arm/arm-v7m/cortex-m4/gcc/*.c} \
		${wildcard $(TOP_DIR)/arch/arm/arm-v7m/common/*.c}
		C_SOURCES += $(ARCH_SRC)

CMSIS_SRC =  \
		${wildcard $(TOP_DIR)/osal/cmsis_os/*.c}
		C_SOURCES += $(CMSIS_SRC)

PLATFORM_SRC =  \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dac.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dac_ex.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c \
		$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c \
		$(TOP_DIR)/platform/hal/st/stm32l4xx/src/tos_hal_uart.c
		C_SOURCES += $(PLATFORM_SRC)

NET_SRC =  \
		$(TOP_DIR)/net/at/src/tos_at.c \
		$(TOP_DIR)/net/at/src/tos_at_utils.c \
		$(TOP_DIR)/net/sal_module_wrapper/sal_module_wrapper.c \
		$(TOP_DIR)/devices/esp8266/esp8266.c
		C_SOURCES += $(NET_SRC)

BSP_SRC =  \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/gpio.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/main.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/mcu_init.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/stm32l4xx_hal_msp.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/stm32l4xx_it_module.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/usart.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/adc.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/dac.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/i2c.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/spi.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/system_stm32l4xx.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/DHT11/DHT11_BUS.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/OLED/oled.c \
		$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/E53_IA1/E53_IA1.c
		C_SOURCES += $(BSP_SRC)

COMPONENTS_SRC =  \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/wrapper/src/mqtt_wrapper.c \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/wrapper/src/transport_wrapper.c \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTConnectClient.c \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTConnectServer.c \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTDeserializePublish.c \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTFormat.c \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTPacket.c \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTSerializePublish.c \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTSubscribeClient.c \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTSubscribeServer.c \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTUnsubscribeClient.c \
		$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTUnsubscribeServer.c \
		$(TOP_DIR)/components/utils/JSON/src/cJSON.c
		C_SOURCES += $(COMPONENTS_SRC)

EXAMPLES_SRC =  \
		$(TOP_DIR)/examples/farm_ai_demo/farm_ai_demo.c
		C_SOURCES += $(EXAMPLES_SRC)

# ASM sources
ASM_SOURCES =  \
startup_stm32l431xx.s \

ASM_SOURCES_S =  \
$(TOP_DIR)/arch/arm/arm-v7m/cortex-m4/gcc/port_s.S

就這樣,一個嶄新的Makefile誕生了!

BUG修復

在之前的文章中也有提到,默認的編譯器,對浮點型的printf("%f")是不支持的,這裏我們改一下:

LDFLAGS = $(MCU) -u _printf_float -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) \
		-Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections

在這句中,我們添加了一個參數 -u _printf_float, 這樣,就可以順利打印浮點型數據了。

結語

其實這篇文章挺水的,都開始看操作系統源碼以及應用了,不可能改個Makefile都不會。不過我對自己的認識,算是一個澆花匠吧,我不澆水,花兒也可以正常生長,但我澆了水,可以讓花兒長的更好,不用再期待雨水的降臨。所謂 錦上添花,大概如此吧。

萬丈高樓平地起,雖不像那些大樓設計師、高級技師,可以建設棟樑,但現在這個階段,TencentOS-tiny的文檔和代碼都不是很完善,就需要很多我這樣的基層勞動者進行修修補補,搬磚添瓦。我相信我的工作是有意義的。

願未來更好!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章