介绍 FRDM-MCXW71 这个板子是NXP官方赠送给我的,到手已经快2年了,闲来无事给它移植了RTT;这篇文章简单介绍一下RT-Thread系统移植过程,给广大NXP MCU爱好者一个参考
移植 board board\SConscript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 from building import *cwd = GetCurrentDir() src = Split(""" board.c MCUX_Config/board/clock_config.c MCUX_Config/board/pin_mux.c """ )CPPPATH = [cwd, cwd + '/MCUX_Config/board' ] CPPDEFINES = ['DEBUG' , 'CPU_MCXW716CMFPA' ] group = DefineGroup('Drivers' , src, depend = ['' ], CPPPATH = CPPPATH, CPPDEFINES=CPPDEFINES) Return('group' )
board\Kconfig
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 menu "Hardware Drivers Config" config SOC_MCXW71 bool select SOC_MCXW71_SERIES select RT_USING_COMPONENTS_INIT select RT_USING_USER_MAIN default y menu "On-chip Peripheral Drivers" config BSP_USING_PIN bool "Enable GPIO" select RT_USING_PIN default y menuconfig BSP_USING_UART bool "Enable UART" default y select RT_USING_SERIAL if BSP_USING_UART config BSP_USING_UART4 bool "Enable UART1" default y endif endmenu endmenu
board\board.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 #ifndef __BOARD_H__ #define __BOARD_H__ #include <stdint.h> #include <rtthread.h> #include "clock_config.h" #include "fsl_common.h" #include "fsl_gpio.h" #include "pin_mux.h" #include "fsl_edma.h" #if defined(__ARMCC_VERSION) extern int Image$$ARM_LIB_HEAP$$ZI$$Base;extern int Image$$ARM_LIB_STACK$$ZI$$Base;#define HEAP_BEGIN ((void *)&Image$$ARM_LIB_HEAP$$ZI$$Base) #define HEAP_END ((void*)&Image$$ARM_LIB_STACK$$ZI$$Base) #elif defined(__ICCARM__) #pragma section="HEAP" #define HEAP_BEGIN (__section_begin("HEAP" )) #define HEAP_END (__section_end("HEAP" )) #elif defined(__GNUC__) extern int __HeapBase;extern int __HeapLimit;#define HEAP_BEGIN ((void *)&__HeapBase) #define HEAP_END ((void *)&__HeapLimit) #endif void rt_hw_board_init (void ) ;#endif
board\MCUX_Config\board\pin_mux.c,这里使能了RGB LED以及LPUART1作为RT-Thread最小系统外设
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 void BOARD_InitPins (void ) { CLOCK_EnableClock (kCLOCK_GpioA); CLOCK_EnableClock (kCLOCK_PortA); CLOCK_EnableClock (kCLOCK_PortC); gpio_pin_config_t LED_GREEN_config = { .pinDirection = kGPIO_DigitalOutput, .outputLogic = 0U }; GPIO_PinInit (BOARD_INITPINS_LED_GREEN_GPIO, BOARD_INITPINS_LED_GREEN_PIN, &LED_GREEN_config); const port_pin_config_t LED_GREEN = { (uint16_t )kPORT_PullDisable, (uint16_t )kPORT_LowPullResistor, (uint16_t )kPORT_FastSlewRate, (uint16_t )kPORT_PassiveFilterDisable, (uint16_t )kPORT_OpenDrainDisable, (uint16_t )kPORT_LowDriveStrength, (uint16_t )kPORT_NormalDriveStrength, (uint16_t )kPORT_MuxAsGpio, (uint16_t )kPORT_UnlockRegister}; PORT_SetPinConfig (BOARD_INITPINS_LED_GREEN_PORT, BOARD_INITPINS_LED_GREEN_PIN, &LED_GREEN); const port_pin_config_t portc2_pin39_config = { (uint16_t )kPORT_PullDisable, (uint16_t )kPORT_LowPullResistor, (uint16_t )kPORT_FastSlewRate, (uint16_t )kPORT_PassiveFilterDisable, (uint16_t )kPORT_OpenDrainDisable, (uint16_t )kPORT_LowDriveStrength, (uint16_t )kPORT_NormalDriveStrength, (uint16_t )kPORT_MuxAlt3, (uint16_t )kPORT_UnlockRegister}; PORT_SetPinConfig (PORTC, 2U , &portc2_pin39_config); const port_pin_config_t portc3_pin40_config = { (uint16_t )kPORT_PullDisable, (uint16_t )kPORT_LowPullResistor, (uint16_t )kPORT_FastSlewRate, (uint16_t )kPORT_PassiveFilterDisable, (uint16_t )kPORT_OpenDrainDisable, (uint16_t )kPORT_LowDriveStrength, (uint16_t )kPORT_NormalDriveStrength, (uint16_t )kPORT_MuxAlt3, (uint16_t )kPORT_UnlockRegister}; PORT_SetPinConfig (PORTC, 3U , &portc3_pin40_config); }
board\linker_scripts,从NXP官方的MCXW71 SDK包里边获取
Libraries Libraries\Kconfig
1 2 3 4 config SOC_MCX bool select ARCH_ARM_CORTEX_M33 select ARCH_ARM_CORTEX_FPU
Libraries\MCXW71\MCXW71,这些基本的BSP文件均可以从官方的SDK包里边提取:gcc编译要保证gcc目录文件齐全
Libraries\MCXW71\MCXW71\MCXW716C_features.h,去掉这个宏,否则编译不过
applications applications\main.c,测试用例,这里使用pin驱动点亮RGB LED、驱动开发板按钮
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 #include <rtdevice.h> #include <rtthread.h> #include "drv_pin.h" #define R_LED ((0*32)+21) #define G_LED ((0*32)+20) #define B_LED ((0*32)+19) #define BUTTON_PIN ((2*32)+6) static void sw_pin_cb (void *args) ;int main (void ) { rt_pin_mode (R_LED, PIN_MODE_OUTPUT); rt_pin_mode (G_LED, PIN_MODE_OUTPUT); rt_pin_mode (B_LED, PIN_MODE_OUTPUT); rt_pin_mode (BUTTON_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_attach_irq (BUTTON_PIN, PIN_IRQ_MODE_FALLING, sw_pin_cb, RT_NULL); rt_pin_irq_enable (BUTTON_PIN, 1 ); rt_kprintf ("NXP MCXW71 board!\r\n" ); while (1 ) { rt_pin_write (R_LED, PIN_LOW); rt_pin_write (G_LED, PIN_HIGH); rt_pin_write (B_LED, PIN_HIGH); rt_thread_mdelay (500 ); rt_pin_write (R_LED, PIN_HIGH); rt_pin_write (G_LED, PIN_LOW); rt_pin_write (B_LED, PIN_HIGH); rt_thread_mdelay (500 ); rt_pin_write (R_LED, PIN_HIGH); rt_pin_write (G_LED, PIN_HIGH); rt_pin_write (B_LED, PIN_LOW); rt_thread_mdelay (500 ); rt_pin_write (R_LED, PIN_LOW); rt_pin_write (G_LED, PIN_LOW); rt_pin_write (B_LED, PIN_HIGH); rt_thread_mdelay (500 ); rt_pin_write (R_LED, PIN_LOW); rt_pin_write (G_LED, PIN_HIGH); rt_pin_write (B_LED, PIN_LOW); rt_thread_mdelay (500 ); rt_pin_write (R_LED, PIN_HIGH); rt_pin_write (G_LED, PIN_LOW); rt_pin_write (B_LED, PIN_LOW); rt_thread_mdelay (500 ); rt_pin_write (R_LED, PIN_LOW); rt_pin_write (G_LED, PIN_LOW); rt_pin_write (B_LED, PIN_LOW); rt_thread_mdelay (500 ); rt_pin_write (R_LED, PIN_HIGH); rt_pin_write (G_LED, PIN_HIGH); rt_pin_write (B_LED, PIN_HIGH); rt_thread_mdelay (500 ); } } static void sw_pin_cb (void *args) { rt_kprintf ("sw pressed\r\n" ); }
rt-thread 使用env工具导出的RT-Thread系统包,因为要用NXP工程要用到Cmake
顶层文件 CMakeLists.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 CMAKE_MINIMUM_REQUIRED(VERSION 3.10) SET(CMAKE_SYSTEM_NAME Generic) SET(CMAKE_SYSTEM_PROCESSOR cortex-m33) SET(CMAKE_EXPORT_COMPILE_COMMANDS ON) SET(CMAKE_C_COMPILER "C:/env-windows/tools/bin/../../tools/gnu_gcc/arm_gcc/mingw/bin/arm-none-eabi-gcc.exe" ) SET(CMAKE_ASM_COMPILER "C:/env-windows/tools/bin/../../tools/gnu_gcc/arm_gcc/mingw/bin/arm-none-eabi-gcc.exe" ) SET(CMAKE_C_FLAGS " -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -Wall -D__FPU_PRESENT -gdwarf-2 -O0" ) SET(CMAKE_ASM_FLAGS " -c -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -x assembler-with-cpp -D__START=entry -D__STARTUP_CLEAR_BSS -gdwarf-2" ) SET(CMAKE_C_COMPILER_WORKS TRUE) SET(CMAKE_CXX_COMPILER "C:/env-windows/tools/bin/../../tools/gnu_gcc/arm_gcc/mingw/bin/arm-none-eabi-g++.exe" ) SET(CMAKE_CXX_FLAGS " -Woverloaded-virtual -fno-exceptions -fno-rtti -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -Wall -D__FPU_PRESENT -gdwarf-2 -O0" ) SET(CMAKE_CXX_COMPILER_WORKS TRUE) SET(CMAKE_OBJCOPY "C:/env-windows/tools/bin/../../tools/gnu_gcc/arm_gcc/mingw/bin/arm-none-eabi-objcopy.exe" ) SET(CMAKE_SIZE "C:/env-windows/tools/bin/../../tools/gnu_gcc/arm_gcc/mingw/bin/arm-none-eabi-size.exe" ) SET(CMAKE_EXE_LINKER_FLAGS " -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -specs=nano.specs -specs=nosys.specs -Wl,--defsym=__heap_size__=0x10000,--gc-sections,-Map=rtthread.map,--print-memory-usage -T ${CMAKE_SOURCE_DIR} /board/linker_scripts/MCXW716_flash.ld -Wl,--gc-sections,--print-memory-usage" ) SET(CMAKE_C_STANDARD 11) SET(CMAKE_CXX_STANDARD 17) PROJECT(rtthread C CXX ASM) INCLUDE_DIRECTORIES( . applications board board/MCUX_Config/board rt-thread/include rt-thread/libcpu/arm/common rt-thread/libcpu/arm/cortex-m33 rt-thread/components/drivers/include rt-thread/components/drivers/phy rt-thread/components/drivers/smp_call rt-thread/components/finsh rt-thread/components/libc/compilers/common/include rt-thread/components/libc/compilers/newlib rt-thread/components/libc/posix/io/epoll rt-thread/components/libc/posix/io/eventfd rt-thread/components/libc/posix/io/poll rt-thread/components/libc/posix/ipc rt-thread/components/utilities/ulog Libraries/drivers Libraries/drivers/config Libraries/CMSIS/Core/Include Libraries/MCXW71/MCXW71 Libraries/MCXW71/MCXW71/drivers Libraries/MCXW71/MCXW71/drivers/romapi/flash Libraries/MCXW71/MCXW71/drivers/romapi/mem_interface Libraries/MCXW71/MCXW71/drivers/romapi/nboot Libraries/MCXW71/MCXW71/drivers/romapi/runbootloader ) ADD_DEFINITIONS( -D_REENT_SMALL -DDEBUG -DCPU_MCXW716CMFPA -D__RTTHREAD__ -DRT_USING_NEWLIBC -DRT_USING_LIBC -D_POSIX_C_SOURCE=1 ) SET(RT_APPLICATIONS_SOURCES applications/main.c ) SET(RT_COMPILER_SOURCES rt-thread/components/libc/compilers/common/cctype.c rt-thread/components/libc/compilers/common/cstdlib.c rt-thread/components/libc/compilers/common/cstring.c rt-thread/components/libc/compilers/common/ctime.c rt-thread/components/libc/compilers/common/cunistd.c rt-thread/components/libc/compilers/common/cwchar.c rt-thread/components/libc/compilers/newlib/syscalls.c ) SET(RT_DEVICEDRIVERS_SOURCES rt-thread/components/drivers/core/device.c rt-thread/components/drivers/hwtimer/hwtimer.c rt-thread/components/drivers/ipc/completion_comm.c rt-thread/components/drivers/ipc/completion_up.c rt-thread/components/drivers/ipc/condvar.c rt-thread/components/drivers/ipc/dataqueue.c rt-thread/components/drivers/ipc/pipe.c rt-thread/components/drivers/ipc/ringblk_buf.c rt-thread/components/drivers/ipc/ringbuffer.c rt-thread/components/drivers/ipc/waitqueue.c rt-thread/components/drivers/ipc/workqueue.c rt-thread/components/drivers/pin/dev_pin.c rt-thread/components/drivers/serial/dev_serial.c ) SET(RT_DRIVERS_SOURCES board/MCUX_Config/board/clock_config.c board/MCUX_Config/board/pin_mux.c board/board.c Libraries/drivers/drv_pin.c Libraries/drivers/drv_uart.c ) SET(RT_FINSH_SOURCES rt-thread/components/finsh/msh.c rt-thread/components/finsh/msh_parse.c rt-thread/components/finsh/shell.c rt-thread/components/finsh/cmd.c ) SET(RT_KERNEL_SOURCES rt-thread/src/clock.c rt-thread/src/components.c rt-thread/src/cpu_up.c rt-thread/src/defunct.c rt-thread/src/idle.c rt-thread/src/ipc.c rt-thread/src/irq.c rt-thread/src/kservice.c rt-thread/src/mem.c rt-thread/src/mempool.c rt-thread/src/object.c rt-thread/src/scheduler_comm.c rt-thread/src/scheduler_up.c rt-thread/src/thread.c rt-thread/src/timer.c ) SET(RT_KLIBC_SOURCES rt-thread/src/klibc/kstring.c rt-thread/src/klibc/kerrno.c rt-thread/src/klibc/rt_vsscanf.c rt-thread/src/klibc/rt_vsnprintf_tiny.c rt-thread/src/klibc/kstdio.c ) SET(RT_LIBCPU_SOURCES rt-thread/libcpu/arm/common/atomic_arm.c rt-thread/libcpu/arm/common/div0.c rt-thread/libcpu/arm/common/showmem.c rt-thread/libcpu/arm/cortex-m33/context_gcc.S rt-thread/libcpu/arm/cortex-m33/cpuport.c rt-thread/libcpu/arm/cortex-m33/syscall_gcc.S rt-thread/libcpu/arm/cortex-m33/trustzone.c ) SET(RT_LIBRARIES_SOURCES Libraries/MCXW71/MCXW71/drivers/fsl_edma.c Libraries/MCXW71/MCXW71/drivers/fsl_spc.c Libraries/MCXW71/MCXW71/drivers/fsl_cmc.c Libraries/MCXW71/MCXW71/drivers/fsl_lpuart.c Libraries/MCXW71/MCXW71/gcc/startup_MCXW716C.S Libraries/MCXW71/MCXW71/drivers/fsl_crc.c Libraries/MCXW71/MCXW71/drivers/fsl_gpio.c Libraries/MCXW71/MCXW71/drivers/fsl_ccm32k.c Libraries/MCXW71/MCXW71/drivers/fsl_common.c Libraries/MCXW71/MCXW71/system_MCXW716C.c Libraries/MCXW71/MCXW71/drivers/fsl_clock.c Libraries/MCXW71/MCXW71/drivers/fsl_common_arm.c ) SET(RT_POSIX_SOURCES ) SET(RT_UTESTCASES_SOURCES ) SET(RT_UTILITIES_SOURCES rt-thread/components/utilities/ulog/ulog.c rt-thread/components/utilities/ulog/backend/console_be.c ) SET(RT_DEVICEDRIVERS_DEFINES __RT_IPC_SOURCE__ ) SET(RT_KERNEL_DEFINES __RT_KERNEL_SOURCE__ ) SET(RT_COMPILER_LIBS c m ) ADD_LIBRARY(rtt_Compiler OBJECT ${RT_COMPILER_SOURCES} ) ADD_LIBRARY(rtt_DeviceDrivers OBJECT ${RT_DEVICEDRIVERS_SOURCES} ) ADD_LIBRARY(rtt_Drivers OBJECT ${RT_DRIVERS_SOURCES} ) ADD_LIBRARY(rtt_Finsh OBJECT ${RT_FINSH_SOURCES} ) ADD_LIBRARY(rtt_Kernel OBJECT ${RT_KERNEL_SOURCES} ) ADD_LIBRARY(rtt_klibc OBJECT ${RT_KLIBC_SOURCES} ) ADD_LIBRARY(rtt_libcpu OBJECT ${RT_LIBCPU_SOURCES} ) ADD_LIBRARY(rtt_Libraries OBJECT ${RT_LIBRARIES_SOURCES} ) ADD_LIBRARY(rtt_Utilities OBJECT ${RT_UTILITIES_SOURCES} ) ADD_LIBRARY(rtt_POSIX INTERFACE) ADD_LIBRARY(rtt_utestcases INTERFACE) TARGET_COMPILE_DEFINITIONS(rtt_DeviceDrivers PRIVATE ${RT_DEVICEDRIVERS_DEFINES} ) TARGET_COMPILE_DEFINITIONS(rtt_Kernel PRIVATE ${RT_KERNEL_DEFINES} ) TARGET_LINK_LIBRARIES(rtt_Compiler INTERFACE ${RT_COMPILER_LIBS} ) ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} .elf ${RT_APPLICATIONS_SOURCES} ) TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} .elf rtt_Compiler rtt_DeviceDrivers rtt_Drivers rtt_Finsh rtt_Kernel rtt_klibc rtt_libcpu rtt_Libraries rtt_Utilities rtt_POSIX rtt_utestcases ) ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME} .elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} -O binary --remove-section=.boot_data --remove-section=.image_vertor_table --remove-section=.ncache ${CMAKE_PROJECT_NAME} .elf rtthread.bin COMMAND ${CMAKE_SIZE} ${CMAKE_PROJECT_NAME} .elf ) if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR} /custom.cmake)include(${CMAKE_CURRENT_SOURCE_DIR} /custom.cmake) endif()
Kconfig
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 mainmenu "RT-Thread Configuration" BSP_DIR := . RTT_DIR := ../../../../.. PKGS_DIR := packages config SOC_MCX bool select ARCH_ARM_CORTEX_M33 select ARCH_ARM_CORTEX_SECURE default y source "$(RTT_DIR)/Kconfig" osource "$PKGS_DIR/Kconfig" rsource "Libraries/Kconfig" rsource "board/Kconfig"
rtconfig.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 import osimport sysARCH='arm' CPU='cortex-m33' CROSS_TOOL='gcc' BOARD_NAME = 'lpcxpresso' BSP_LIBRARY_TYPE = 'MCXW71' if os.getenv('RTT_CC' ): CROSS_TOOL = os.getenv('RTT_CC' ) if os.getenv('RTT_ROOT' ): RTT_ROOT = os.getenv('RTT_ROOT' ) if CROSS_TOOL == 'gcc' : PLATFORM = 'gcc' EXEC_PATH = r'C:\Users\XXYYZZ' elif CROSS_TOOL == 'keil' : PLATFORM = 'armclang' EXEC_PATH = r'C:/Keil_v5' elif CROSS_TOOL == 'iar' : PLATFORM = 'iccarm' EXEC_PATH = r'C:\Program Files\IAR Systems\Embedded Workbench 9.1' if os.getenv('RTT_EXEC_PATH' ): EXEC_PATH = os.getenv('RTT_EXEC_PATH' ) BUILD = 'debug' if PLATFORM == 'gcc' : PREFIX = 'arm-none-eabi-' CC = PREFIX + 'gcc' CXX = PREFIX + 'g++' AS = PREFIX + 'gcc' AR = PREFIX + 'ar' LINK = PREFIX + 'gcc' TARGET_EXT = 'elf' SIZE = PREFIX + 'size' OBJDUMP = PREFIX + 'objdump' OBJCPY = PREFIX + 'objcopy' STRIP = PREFIX + 'strip' DEVICE = ' -mcpu=' + CPU + ' -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' CFLAGS = DEVICE + ' -Wall -D__FPU_PRESENT' AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__START=entry -D__STARTUP_CLEAR_BSS' LFLAGS = DEVICE + ' -specs=nano.specs -specs=nosys.specs -Wl,--defsym=__heap_size__=0x10000,--gc-sections,-Map=rtthread.map,--print-memory-usage -Tboard/linker_scripts/MCXW716_flash.ld' CPATH = '' LPATH = '' if BUILD == 'debug' : CFLAGS += ' -gdwarf-2' AFLAGS += ' -gdwarf-2' CFLAGS += ' -O0' else : CFLAGS += ' -O2 -Os' POST_ACTION = OBJCPY + ' -O binary --remove-section=.boot_data --remove-section=.image_vertor_table --remove-section=.ncache $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' CXXFLAGS = ' -Woverloaded-virtual -fno-exceptions -fno-rtti' CXXFLAGS += CFLAGS M_CFLAGS = CFLAGS + ' -mlong-calls -fPIC ' M_CXXFLAGS = CXXFLAGS + ' -mlong-calls -fPIC' M_LFLAGS = DEVICE + CXXFLAGS + ' -Wl,--gc-sections,-z,max-page-size=0x4' +\ ' -shared -fPIC -nostartfiles -static-libgcc' M_POST_ACTION = STRIP + ' -R .hash $TARGET\n' + SIZE + ' $TARGET \n' elif PLATFORM == 'armcc' : CC = 'armcc' CXX = 'armcc' AS = 'armasm' AR = 'armar' LINK = 'armlink' TARGET_EXT = 'axf' DEVICE = ' --cpu ' + CPU + '.fp.sp' CFLAGS = DEVICE + ' --apcs=interwork' AFLAGS = DEVICE LFLAGS = DEVICE + ' --libpath "' + EXEC_PATH + '/ARM/ARMCC/lib" --info sizes --info totals --info unused --info veneers --list rtthread.map --scatter "board/linker_scripts/MCXW716_flash" ' LFLAGS += ' --keep *.o(.rti_fn.*) --keep *.o(FSymTab) --keep *.o(VSymTab)' CFLAGS += ' --diag_suppress=66,1296,186,6134' CFLAGS += ' -I' + EXEC_PATH + '/ARM/RV31/INC' LFLAGS += ' --libpath ' + EXEC_PATH + '/ARM/RV31/LIB' EXEC_PATH += '/arm/bin40/' if BUILD == 'debug' : CFLAGS += ' -g -O0' AFLAGS += ' -g' else : CFLAGS += ' -O2' CXXFLAGS = CFLAGS CFLAGS += ' --c99' POST_ACTION = 'fromelf -z $TARGET' elif PLATFORM == 'armclang' : CC = 'armclang' CXX = 'armclang' AS = 'armasm' AR = 'armar' LINK = 'armlink' TARGET_EXT = 'axf' DEVICE = ' --cpu Cortex-M33 ' CFLAGS = ' --target=arm-arm-none-eabi' CFLAGS += ' -mcpu=' + CPU CFLAGS += ' -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar ' CFLAGS += ' -gdwarf-3 -ffunction-sections ' AFLAGS = DEVICE + ' --apcs=interwork ' LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers ' LFLAGS += ' --list rt-thread.map ' LFLAGS += r' --strict --scatter "board/linker_scripts/MCXW716_flash" ' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCLANG/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCLANG/lib' EXEC_PATH += '/ARM/ARMCLANG/bin/' if BUILD == 'debug' : CFLAGS += ' -g -O1' AFLAGS += ' -g' else : CFLAGS += ' -O2' CXXFLAGS = CFLAGS CFLAGS += ' -std=c99' POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' elif PLATFORM == 'iccarm' : CC = 'iccarm' CXX = 'iccarm' AS = 'iasmarm' AR = 'iarchive' LINK = 'ilinkarm' TARGET_EXT = 'out' DEVICE = ' -D__FPU_PRESENT' CFLAGS = DEVICE CFLAGS += ' --diag_suppress Pa050' CFLAGS += ' --no_cse' CFLAGS += ' --no_unroll' CFLAGS += ' --no_inline' CFLAGS += ' --no_code_motion' CFLAGS += ' --no_tbaa' CFLAGS += ' --no_clustering' CFLAGS += ' --no_scheduling' CFLAGS += ' --debug' CFLAGS += ' --endian=little' CFLAGS += ' --cpu=' + CPU CFLAGS += ' -e' CFLAGS += ' --fpu=None' CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' CFLAGS += ' -Ol' CFLAGS += ' --use_c++_inline' AFLAGS = '' AFLAGS += ' -s+' AFLAGS += ' -w+' AFLAGS += ' -r' AFLAGS += ' --cpu ' + CPU AFLAGS += ' --fpu None' if BUILD == 'debug' : CFLAGS += ' --debug' CFLAGS += ' -On' else : CFLAGS += ' -Oh' LFLAGS = ' --config "board/linker_scripts/MCXW716_flash.icf"' LFLAGS += ' --redirect _Printf=_PrintfTiny' LFLAGS += ' --redirect _Scanf=_ScanfSmall' LFLAGS += ' --entry __iar_program_start' CXXFLAGS = CFLAGS EXEC_PATH = EXEC_PATH + '/arm/bin/' POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' def dist_handle (BSP_ROOT, dist_dir ): cwd_path = os.getcwd() sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), '..' , 'tools' )) from sdk_dist import dist_do_building dist_do_building(BSP_ROOT, dist_dir)
SConstruct
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 import osimport sysimport rtconfigif os.getenv('RTT_ROOT' ): RTT_ROOT = os.getenv('RTT_ROOT' ) else : RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../../..' ) if not os.getenv("RTT_ROOT" ): RTT_ROOT="rt-thread" sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools' )] try : from building import * except : print ('Cannot found RT-Thread root directory, please check RTT_ROOT' ) print (RTT_ROOT) exit(-1 ) TARGET = 'rtthread.' + rtconfig.TARGET_EXT if rtconfig.PLATFORM == 'armcc' : env = Environment(tools = ['mingw' ], AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS, CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, AR = rtconfig.AR, ARFLAGS = '-rc' , LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS, CXXCOM = '$CXX -o $TARGET --cpp -c $CXXFLAGS $_CCCOMCOM $SOURCES' ) else : env = Environment(tools = ['mingw' ], AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS, CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, AR = rtconfig.AR, ARFLAGS = '-rc' , LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS, CXXCOM = '$CXX -o $TARGET -c $CXXFLAGS $_CCCOMCOM $SOURCES' ) env.PrependENVPath('PATH' , rtconfig.EXEC_PATH) if rtconfig.PLATFORM in ['iccarm' ]: env.Replace(CCCOM = ['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES' ]) env.Replace(ARFLAGS = ['' ]) env.Replace(LINKCOM = env["LINKCOM" ] + ' --map rtthread.map' ) Export('RTT_ROOT' ) Export('rtconfig' ) SDK_ROOT = os.path.abspath('./' ) if os.path.exists(SDK_ROOT + '/Libraries' ): libraries_path_prefix = SDK_ROOT + '/Libraries' else : libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/Libraries' SDK_LIB = libraries_path_prefix Export('SDK_LIB' ) objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False ) objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers' , 'SConscript' ))) objs.extend(SConscript(os.path.join(libraries_path_prefix, rtconfig.BSP_LIBRARY_TYPE, 'SConscript' ))) DoBuilding(TARGET, objs)
运行 在VSCode环境下按F5启动编译、运行、调试
开发板RGB LED点亮
按下用户按钮控制台输出相关日志
开源 BSP已经开源:https://gitee.com/hywing/rtt-mcxw71.git
参考 NXP MCU MCXW71 VSCode运行环境搭建:https://hywing.tech/frdm-mcxw71-tutorial.html