这一次咱们来移植大名鼎鼎的ThreadX RTOS,目前微软已经把它转到eclipse组织下了,笔者比较喜欢这个os的代码风格。为跑起ThreadX RTOS,至少需要timer中断中断,然后弄个uart驱动输出。我们最好利用原厂的一些驱动代码,英飞凌是由工具生成的驱动代码,但由于你懂的原因,英飞凌那个工具我用起来不太方便,怎么办?上一篇评测文章其实已经有些风声:我是把RT-Thread英飞凌的bsp抠出来替代的,RT-Thread大部分外设都配置好了,所以它带的bsp和自己用英飞凌的工具自动生成的bsp代码应该差不多。

RT-Thread的 英飞凌的bsp 有些代码是做成package的,所以我们scons --menuconfig一次然后更新包:
cd rt-thread/bsp/Infineon/psoc6-evaluationkit-062S2
  • scons --menuconfig
  • pkgs --update
  • 复制代码


    现在可以复制rt-thread/bsp/Infineon/psoc6-evaluationkit-062S2目录备用
    cp -a rt-thread/bsp/Infineon/psoc6-evaluationkit-062S2 ~/psoc6
    复制代码


    因ThreadX RTOS原生使用cmake管理,所以笔者也以cmake组织工程编译。为写CMakeLists.txt,需要对刚刚拷贝出来的psoc6文件仔细分析哪些是bsp驱动、哪些是RT-Thread的HAL,哪些是RT-Thread的app。经过分析后发现,
    1.真正有用的目录就是libs和packages两个目录,可以其它目录都删除了
    2.libs和packages目录下的目录/文件并没有全部用上,需要分析SConscript后把结果写入CMakeLists.txt编译规则,具体可以参考笔者后附的完整CMakeLists.txt文件
    set(CMAKE_SYSTEM_NAME Generic)
  • set(CMAKE_SYSTEM_VERSION 1)
  • set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
  • cmake_minimum_required(VERSION 3.20)

  • set(CMAKE_C_COMPILER arm-none-eabi-gcc)
  • set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
  • set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
  • set(CMAKE_AR arm-none-eabi-ar)
  • set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
  • set(CMAKE_OBJDUMP arm-none-eabi-objdump)
  • set(SIZE arm-none-eabi-size)

  • set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  • set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  • set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  • set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

  • add_compile_options(-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16)
  • add_compile_options(-ffunction-sections -fdata-sections -fno-builtin -fno-common -Wall -Wshadow -Wdouble-promotion -Wno-unused-parameter)

  • add_compile_options(-O3)

  • project(cy8c624alqi C ASM)
  • set(CMAKE_CXX_STANDARD 11)
  • set(CMAKE_C_STANDARD 99)

  • include_directories(libs/TARGET_RTT-062S2/config/GeneratedSource
  •                     libs/TARGET_RTT-062S2
  •                     packages/Infineon_cmsis-latest/Core/Include
  •                     packages/Infineon_retarget-io-latest
  •                     packages/Infineon_core-lib-latest/include
  •                     packages/Infineon_capsense-latest
  •                     packages/Infineon_mtb-hal-cat1-latest/include
  •                     packages/Infineon_mtb-hal-cat1-latest/include_pvt
  •                     packages/Infineon_mtb-hal-cat1-latest/COMPONENT_CAT1A/include
  •                     packages/Infineon_mtb-hal-cat1-latest/COMPONENT_CAT1A/include/pin_packages
  •                     packages/Infineon_mtb-hal-cat1-latest/COMPONENT_CAT1A/include/triggers
  •                     packages/Infineon_mtb-pdl-cat1-latest/drivers/include
  •                     packages/Infineon_mtb-pdl-cat1-latest/devices/COMPONENT_CAT1A/include
  •                     packages/Infineon_mtb-pdl-cat1-latest/devices/COMPONENT_CAT1A/include/ip)

  • add_definitions(-DCY_RETARGET_IO_NO_FLOAT -DCY8C624ALQI_S2D42 -DCORE_NAME_CM0P_0 -DCORE_NAME_CM4_0 -DCY_USING_PREBUILT_CM0P_IMAGE -DCY_USING_HAL -DCOMPONENT_CAT1A -DCOMPONENT_CAT1)

  • file(GLOB_RECURSE SOURCES
  •                 "applications/threadx/*.c"
  •                 "packages/Infineon_cat1cm0p-latest/COMPONENT_CAT1A/COMPONENT_CM0P_SLEEP/*.c"
  •                 "packages/Infineon_retarget-io-latest/cy_retarget_io.c"
  •                 "packages/Infineon_mtb-pdl-cat1-latest/devices/COMPONENT_CAT1A/source/cy_device.c"
  •                 "packages/Infineon_mtb-pdl-cat1-latest/drivers/source/*.c"
  •                 "packages/Infineon_mtb-pdl-cat1-latest/drivers/source/TOOLCHAIN_GCC_ARM/cy_syslib_ext.S"
  •                 "packages/Infineon_mtb-hal-cat1-latest/source/*.c"
  •                 "packages/Infineon_mtb-hal-cat1-latest/COMPONENT_CAT1A/source/triggers/cyhal_triggers_psoc6_02.c"
  •                 "packages/Infineon_mtb-hal-cat1-latest/COMPONENT_CAT1A/source/pin_packages/cyhal_psoc6_02_68_qfn.c"
  •                 "libs/TARGET_RTT-062S2/COMPONENT_CM4/TOOLCHAIN_GCC_ARM/startup_psoc6_02_cm4.S"
  •                 "libs/TARGET_RTT-062S2/COMPONENT_CM4/system_psoc6_cm4.c"
  •                 "libs/TARGET_RTT-062S2/config/GeneratedSource/*.c"
  •                 "libs/TARGET_RTT-062S2/cybsp.c"
  •                 )

  • set(THREADX_SRC_DIR ${CMAKE_SOURCE_DIR}/../../kernel/threadx/)
  • set(THREADX_ARCH "cortex_m4")
  • set(THREADX_TOOLCHAIN "gnu")
  • add_subdirectory(${THREADX_SRC_DIR}/threadx threadx)

  • set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/board/linker_scripts/link.ld)
  • add_link_options(
  •                 -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16
  •                 -Wl,--gc-sections,--print-memory-usage,-Map,${PROJECT_NAME}.map
  •                 --specs=nano.specs
  •                 --specs=nosys.specs)
  • add_link_options(-T ${LINKER_SCRIPT})

  • add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})

  • target_link_libraries(${PROJECT_NAME}.elf azrtos::threadx)

  • set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
  • set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
  • set(LST_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.lst)
  • add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
  •         COMMAND ${CMAKE_OBJCOPY} -Oihex [        DISCUZ_CODE_140        ]lt;TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
  •         COMMAND ${CMAKE_OBJCOPY} -Obinary [        DISCUZ_CODE_140        ]lt;TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
  •         COMMAND ${CMAKE_OBJDUMP} --all-headers --demangle --disassemble [        DISCUZ_CODE_140        ]lt;TARGET_FILE:${PROJECT_NAME}.elf> > ${LST_FILE}
  •         COMMAND ${SIZE} --format=berkeley [        DISCUZ_CODE_140        ]lt;TARGET_FILE:${PROJECT_NAME}.elf>
  • )
  • 复制代码

    创建applications/threadx目录,目录中有main.c和sample_threadx.c。其中sample_threadx.c内容来自ThreadX的测试用例,main.c内容如下:
    #include "cyhal.h"
  • #include "cybsp.h"
  • #include "cy_retarget_io.h"

  • #define TICK_PER_SECOND 100

  • extern void tx_main(void);
  • extern void _tx_timer_interrupt(void);

  • static void handle_error(void)
  • {
  •      /* Disable all interrupts. */
  •     __disable_irq();

  •     CY_ASSERT(0);
  • }

  • int main(void)
  • {
  •         cy_rslt_t result;

  •         /* Initialize the device and board peripherals */
  •         result = cybsp_init();
  •         if (result != CY_RSLT_SUCCESS)
  •                 handle_error();

  •         /* Initialize retarget-io to use the debug UART port */
  •         result = cy_retarget_io_init_fc(CYBSP_DEBUG_UART_TX,
  •                                         CYBSP_DEBUG_UART_RX,
  •                                         NC,
  •                                         NC,
  •                                         CY_RETARGET_IO_BAUDRATE);
  •         if (result != CY_RSLT_SUCCESS)
  •                 handle_error();

  •         tx_main();
  • }

  • static void SysTick_Handler_CB(void)
  • {
  • #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
  •         _tx_execution_isr_enter();
  • #endif
  •         _tx_timer_interrupt();
  • #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
  •         _tx_execution_isr_exit();
  • #endif
  • }

  • void _tx_initialize_low_level(void)
  • {
  •         __disable_irq();

  •         /* TODO Enable the cycle count register */

  •         /* not used */
  •         //_tx_initialize_unused_memory = __RAM_segment_used_end__;
  •         //_tx_thread_system_stack_ptr = _estack;

  •         SysTick_Config(SystemCoreClock / TICK_PER_SECOND);
  •         (void)Cy_SysInt_SetVector(SysTick_IRQn, SysTick_Handler_CB);

  •         NVIC_SetPriority(SVCall_IRQn, 0xff);
  •         NVIC_SetPriority(PendSV_IRQn, 0xff);
  •         NVIC_SetPriority(SysTick_IRQn, 4);
  • }
  • 复制代码

    编译:
    cmake -B build
  • cmake --build build
  • 复制代码

    烧录:
    openocd -f interface/kitprog3.cfg -f target/psoc6_2m.cfg -c "program build/cy8c624alqi.bin verify reset exit 0x10000000"
    复制代码

    运行视频: