From b11cb41ae70a8f31b58cda9807cb7a774369d8b8 Mon Sep 17 00:00:00 2001 From: YuQi Date: Tue, 30 Aug 2022 03:35:23 +0800 Subject: [PATCH] tms320f28379d fix init (#6343) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决 tms320f28379d bsp 启动的问题。主要改动如下。 修正context.s中汇编代码错误。在旧版的代码中,操作数为32位而汇编命令却使用了针对16位数据的命令MOV,导致程序在某些情况无法正常启动线程。 由于C28x的平台下,SP只支持16bit寻址,所以用于线程空间存放的heap以及ebss段都需要放在低16位的空间,针对这个问题修改了CMD文件。此外还增加基于CMD文件基于RAM的支持,方便调试。 新增rtdef.h中RT_SECTION,RT_USED,ALIGN和RT_WEAK的定义。旧版bsp中这些定义为空,导致INIT_EXPORT注册的函数失效。 修改程序启动代码,在程序入口直接调用原生启动代码 以上改动在LAUNCHXL-F28379D 通过了测试。 --- bsp/tms320f28379d/.config | 314 ++++++++++++++++-- bsp/tms320f28379d/.cproject | 282 +++++++++++++--- bsp/tms320f28379d/.gitignore | 4 +- .../org.eclipse.core.resources.prefs | 50 +++ bsp/tms320f28379d/2837x_FLASH_lnk_cpu1.cmd | 78 ++--- bsp/tms320f28379d/2837x_RAM_lnk_cpu1.cmd | 78 +++++ bsp/tms320f28379d/Kconfig | 2 +- bsp/tms320f28379d/README.md | 13 +- bsp/tms320f28379d/applications/application.c | 38 --- bsp/tms320f28379d/applications/startup.c | 72 +--- bsp/tms320f28379d/drivers/board.c | 25 +- bsp/tms320f28379d/drivers/board.h | 7 +- bsp/tms320f28379d/figures/build.png | Bin 91851 -> 20564 bytes bsp/tms320f28379d/rtconfig.h | 37 +++ include/rtdef.h | 8 +- libcpu/ti-dsp/c28x/context.s | 163 ++++----- libcpu/ti-dsp/c28x/cpuport.c | 5 +- src/components.c | 5 +- 18 files changed, 829 insertions(+), 352 deletions(-) create mode 100644 bsp/tms320f28379d/2837x_RAM_lnk_cpu1.cmd delete mode 100644 bsp/tms320f28379d/applications/application.c diff --git a/bsp/tms320f28379d/.config b/bsp/tms320f28379d/.config index 6792c2d65c..adeabca77e 100644 --- a/bsp/tms320f28379d/.config +++ b/bsp/tms320f28379d/.config @@ -89,7 +89,9 @@ CONFIG_ARCH_CPU_STACK_GROWS_UPWARD=y # RT-Thread Components # CONFIG_RT_USING_COMPONENTS_INIT=y -# CONFIG_RT_USING_USER_MAIN is not set +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=4 # CONFIG_RT_USING_LEGACY is not set CONFIG_RT_USING_MSH=y CONFIG_RT_USING_FINSH=y @@ -207,19 +209,19 @@ CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 # # IoT - internet of things # +# CONFIG_PKG_USING_LWIP is not set +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set # CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set # CONFIG_PKG_USING_WEBCLIENT is not set # CONFIG_PKG_USING_WEBNET is not set # CONFIG_PKG_USING_MONGOOSE is not set # CONFIG_PKG_USING_MYMQTT is not set -# CONFIG_PKG_USING_MQTTCLIENT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set # CONFIG_PKG_USING_WEBTERMINAL is not set -# CONFIG_PKG_USING_CJSON is not set -# CONFIG_PKG_USING_JSMN is not set # CONFIG_PKG_USING_LIBMODBUS is not set # CONFIG_PKG_USING_FREEMODBUS is not set -# CONFIG_PKG_USING_LJSON is not set -# CONFIG_PKG_USING_EZXML is not set # CONFIG_PKG_USING_NANOPB is not set # @@ -239,10 +241,12 @@ CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set # CONFIG_PKG_USING_PPP_DEVICE is not set # CONFIG_PKG_USING_AT_DEVICE is not set # CONFIG_PKG_USING_ATSRV_SOCKET is not set # CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set # # IoT Cloud @@ -251,10 +255,14 @@ CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 # CONFIG_PKG_USING_GAGENT_CLOUD is not set # CONFIG_PKG_USING_ALI_IOTKIT is not set # CONFIG_PKG_USING_AZURE is not set -# CONFIG_PKG_USING_TENCENT_IOTHUB is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set # CONFIG_PKG_USING_JIOT-C-SDK is not set # CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_EZ_IOT_OS is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set # CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set # CONFIG_PKG_USING_OTA_DOWNLOADER is not set # CONFIG_PKG_USING_IPMSG is not set # CONFIG_PKG_USING_LSSDP is not set @@ -262,40 +270,110 @@ CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 # CONFIG_PKG_USING_LIBRWS is not set # CONFIG_PKG_USING_TCPSERVER is not set # CONFIG_PKG_USING_PROTOBUF_C is not set -# CONFIG_PKG_USING_ONNX_PARSER is not set -# CONFIG_PKG_USING_ONNX_BACKEND is not set # CONFIG_PKG_USING_DLT645 is not set # CONFIG_PKG_USING_QXWZ is not set # CONFIG_PKG_USING_SMTP_CLIENT is not set # CONFIG_PKG_USING_ABUP_FOTA is not set # CONFIG_PKG_USING_LIBCURL2RTT is not set # CONFIG_PKG_USING_CAPNP is not set -# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set # CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set # # security packages # # CONFIG_PKG_USING_MBEDTLS is not set -# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set # CONFIG_PKG_USING_TINYCRYPT is not set # CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set # # language packages # + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_LUATOS_SOC is not set # CONFIG_PKG_USING_LUA is not set # CONFIG_PKG_USING_JERRYSCRIPT is not set # CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set # # multimedia packages # + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set # CONFIG_PKG_USING_WAVPLAYER is not set # CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set + +# +# PainterEngine: A cross-platform graphics application framework written in C language +# +# CONFIG_PKG_USING_PAINTERENGINE is not set +# CONFIG_PKG_USING_PAINTERENGINE_AUX is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set # # tools packages @@ -304,36 +382,115 @@ CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 # CONFIG_PKG_USING_EASYFLASH is not set # CONFIG_PKG_USING_EASYLOGGER is not set # CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set # CONFIG_PKG_USING_RDB is not set -# CONFIG_PKG_USING_QRCODE is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ULOG_FILE is not set +# CONFIG_PKG_USING_LOGMGR is not set # CONFIG_PKG_USING_ADBD is not set # CONFIG_PKG_USING_COREMARK is not set # CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set # CONFIG_PKG_USING_NR_MICRO_SHELL is not set # CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set # CONFIG_PKG_USING_LUNAR_CALENDAR is not set # CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set # # system packages # -# CONFIG_PKG_USING_GUIENGINE is not set + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# CONFIG_PKG_USING_RTDUINO is not set +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_CAIRO is not set # CONFIG_PKG_USING_PIXMAN is not set -# CONFIG_PKG_USING_LWEXT4 is not set # CONFIG_PKG_USING_PARTITION is not set -# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FLASHDB is not set # CONFIG_PKG_USING_SQLITE is not set # CONFIG_PKG_USING_RTI is not set -# CONFIG_PKG_USING_LITTLEVGL2RTT is not set -# CONFIG_PKG_USING_CMSIS is not set # CONFIG_PKG_USING_DFS_YAFFS is not set # CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set # CONFIG_PKG_USING_THREAD_POOL is not set # CONFIG_PKG_USING_ROBOTS is not set # CONFIG_PKG_USING_EV is not set # CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_CHERRYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set # # peripheral libraries and drivers @@ -342,19 +499,29 @@ CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_SHT2X is not set # CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_AS7341 is not set # CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_RTT_ESP_IDF is not set # CONFIG_PKG_USING_ICM20608 is not set -# CONFIG_PKG_USING_U8G2 is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set # CONFIG_PKG_USING_SX12XX is not set # CONFIG_PKG_USING_SIGNAL_LED is not set # CONFIG_PKG_USING_LEDBLINK is not set # CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set # CONFIG_PKG_USING_WM_LIBRARIES is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set # CONFIG_PKG_USING_INFRARED is not set -# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set # CONFIG_PKG_USING_AGILE_BUTTON is not set # CONFIG_PKG_USING_AGILE_LED is not set # CONFIG_PKG_USING_AT24CXX is not set @@ -368,40 +535,123 @@ CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 # CONFIG_PKG_USING_RPLIDAR is not set # CONFIG_PKG_USING_AS608 is not set # CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set # CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_BL_MCU_SDK is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set # # miscellaneous packages # + +# +# project laboratory +# + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set # CONFIG_PKG_USING_LIBCSV is not set # CONFIG_PKG_USING_OPTPARSE is not set # CONFIG_PKG_USING_FASTLZ is not set # CONFIG_PKG_USING_MINILZO is not set # CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set # CONFIG_PKG_USING_MULTIBUTTON is not set # CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set # CONFIG_PKG_USING_CANFESTIVAL is not set # CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set # CONFIG_PKG_USING_KENDRYTE_DEMO is not set # CONFIG_PKG_USING_DIGITALCTRL is not set # CONFIG_PKG_USING_UPACKER is not set # CONFIG_PKG_USING_UPARAM is not set - -# -# samples: kernel and components samples -# -# CONFIG_PKG_USING_KERNEL_SAMPLES is not set -# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set -# CONFIG_PKG_USING_NETWORK_SAMPLES is not set -# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set # CONFIG_PKG_USING_VI is not set -# CONFIG_PKG_USING_NNOM is not set -# CONFIG_PKG_USING_LIBANN is not set -# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_KI is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set -# CONFIG_PKG_USING_VT100 is not set -# CONFIG_PKG_USING_ULAPACK is not set # CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set diff --git a/bsp/tms320f28379d/.cproject b/bsp/tms320f28379d/.cproject index 801e7f7584..3646eff869 100644 --- a/bsp/tms320f28379d/.cproject +++ b/bsp/tms320f28379d/.cproject @@ -15,30 +15,30 @@ - - - + @@ -165,6 +166,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bsp/tms320f28379d/.gitignore b/bsp/tms320f28379d/.gitignore index fe82e2fd6f..e335ff02f9 100644 --- a/bsp/tms320f28379d/.gitignore +++ b/bsp/tms320f28379d/.gitignore @@ -1 +1,3 @@ -.launches/ \ No newline at end of file +.launches/ +/FLASH/ +/RAM/ diff --git a/bsp/tms320f28379d/.settings/org.eclipse.core.resources.prefs b/bsp/tms320f28379d/.settings/org.eclipse.core.resources.prefs index 00c00f182f..9436acf25a 100644 --- a/bsp/tms320f28379d/.settings/org.eclipse.core.resources.prefs +++ b/bsp/tms320f28379d/.settings/org.eclipse.core.resources.prefs @@ -24,3 +24,53 @@ encoding//Debug/objects.mk=UTF-8 encoding//Debug/sources.mk=UTF-8 encoding//Debug/subdir_rules.mk=UTF-8 encoding//Debug/subdir_vars.mk=UTF-8 +encoding//FLASH/DeviceDrivers/ipc/subdir_rules.mk=UTF-8 +encoding//FLASH/DeviceDrivers/ipc/subdir_vars.mk=UTF-8 +encoding//FLASH/DeviceDrivers/subdir_rules.mk=UTF-8 +encoding//FLASH/DeviceDrivers/subdir_vars.mk=UTF-8 +encoding//FLASH/Kernel/subdir_rules.mk=UTF-8 +encoding//FLASH/Kernel/subdir_vars.mk=UTF-8 +encoding//FLASH/applications/subdir_rules.mk=UTF-8 +encoding//FLASH/applications/subdir_vars.mk=UTF-8 +encoding//FLASH/c28x/subdir_rules.mk=UTF-8 +encoding//FLASH/c28x/subdir_vars.mk=UTF-8 +encoding//FLASH/drivers/subdir_rules.mk=UTF-8 +encoding//FLASH/drivers/subdir_vars.mk=UTF-8 +encoding//FLASH/finsh/subdir_rules.mk=UTF-8 +encoding//FLASH/finsh/subdir_vars.mk=UTF-8 +encoding//FLASH/libraries/common/source/subdir_rules.mk=UTF-8 +encoding//FLASH/libraries/common/source/subdir_vars.mk=UTF-8 +encoding//FLASH/libraries/headers/cmd/subdir_rules.mk=UTF-8 +encoding//FLASH/libraries/headers/cmd/subdir_vars.mk=UTF-8 +encoding//FLASH/libraries/headers/source/subdir_rules.mk=UTF-8 +encoding//FLASH/libraries/headers/source/subdir_vars.mk=UTF-8 +encoding//FLASH/makefile=UTF-8 +encoding//FLASH/objects.mk=UTF-8 +encoding//FLASH/sources.mk=UTF-8 +encoding//FLASH/subdir_rules.mk=UTF-8 +encoding//FLASH/subdir_vars.mk=UTF-8 +encoding//RAM/DeviceDrivers/ipc/subdir_rules.mk=UTF-8 +encoding//RAM/DeviceDrivers/ipc/subdir_vars.mk=UTF-8 +encoding//RAM/DeviceDrivers/subdir_rules.mk=UTF-8 +encoding//RAM/DeviceDrivers/subdir_vars.mk=UTF-8 +encoding//RAM/Kernel/subdir_rules.mk=UTF-8 +encoding//RAM/Kernel/subdir_vars.mk=UTF-8 +encoding//RAM/applications/subdir_rules.mk=UTF-8 +encoding//RAM/applications/subdir_vars.mk=UTF-8 +encoding//RAM/c28x/subdir_rules.mk=UTF-8 +encoding//RAM/c28x/subdir_vars.mk=UTF-8 +encoding//RAM/drivers/subdir_rules.mk=UTF-8 +encoding//RAM/drivers/subdir_vars.mk=UTF-8 +encoding//RAM/finsh/subdir_rules.mk=UTF-8 +encoding//RAM/finsh/subdir_vars.mk=UTF-8 +encoding//RAM/libraries/common/source/subdir_rules.mk=UTF-8 +encoding//RAM/libraries/common/source/subdir_vars.mk=UTF-8 +encoding//RAM/libraries/headers/cmd/subdir_rules.mk=UTF-8 +encoding//RAM/libraries/headers/cmd/subdir_vars.mk=UTF-8 +encoding//RAM/libraries/headers/source/subdir_rules.mk=UTF-8 +encoding//RAM/libraries/headers/source/subdir_vars.mk=UTF-8 +encoding//RAM/makefile=UTF-8 +encoding//RAM/objects.mk=UTF-8 +encoding//RAM/sources.mk=UTF-8 +encoding//RAM/subdir_rules.mk=UTF-8 +encoding//RAM/subdir_vars.mk=UTF-8 diff --git a/bsp/tms320f28379d/2837x_FLASH_lnk_cpu1.cmd b/bsp/tms320f28379d/2837x_FLASH_lnk_cpu1.cmd index fca203c4f8..9787987d30 100644 --- a/bsp/tms320f28379d/2837x_FLASH_lnk_cpu1.cmd +++ b/bsp/tms320f28379d/2837x_FLASH_lnk_cpu1.cmd @@ -1,4 +1,4 @@ - +___heap_end = 0x010000; MEMORY { PAGE 0 : /* Program Memory */ @@ -6,14 +6,8 @@ PAGE 0 : /* Program Memory */ /* BEGIN is used for the "boot to Flash" bootloader mode */ BEGIN : origin = 0x080000, length = 0x000002 - RAMLS0 : origin = 0x008000, length = 0x000800 - RAMLS1 : origin = 0x008800, length = 0x000800 - RAMLS2 : origin = 0x009000, length = 0x000800 - RAMLS3 : origin = 0x009800, length = 0x000800 - RAMLS4 : origin = 0x00A000, length = 0x000800 - RAMGS14 : origin = 0x01A000, length = 0x001000 - RAMGS15 : origin = 0x01B000, length = 0x001000 RESET : origin = 0x3FFFC0, length = 0x000002 + RAMGS8_15 : origin = 0x013000, length = 0x009000 /* Flash sectors */ FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */ @@ -33,31 +27,10 @@ PAGE 0 : /* Program Memory */ PAGE 1 : /* Data Memory */ /* Memory (RAM/FLASH) blocks can be moved to PAGE0 for program allocation */ - BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part of M0, BOOT rom will use this for stack */ - RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */ - RAMD1 : origin = 0x00B800, length = 0x000800 RAMM0 : origin = 0x000122, length = 0x0002DE - RAMD0 : origin = 0x00B000, length = 0x000800 - - RAMLS5 : origin = 0x00A800, length = 0x000800 - - RAMGS0 : origin = 0x00C000, length = 0x001000 - RAMGS1 : origin = 0x00D000, length = 0x001000 - RAMGS2 : origin = 0x00E000, length = 0x001000 - RAMGS3 : origin = 0x00F000, length = 0x001000 - RAMGS4 : origin = 0x010000, length = 0x001000 - RAMGS5 : origin = 0x011000, length = 0x001000 - RAMGS6 : origin = 0x012000, length = 0x001000 - RAMGS7 : origin = 0x013000, length = 0x001000 - RAMGS8 : origin = 0x014000, length = 0x001000 - RAMGS9 : origin = 0x015000, length = 0x001000 - RAMGS10 : origin = 0x016000, length = 0x001000 - RAMGS11 : origin = 0x017000, length = 0x001000 - RAMGS12 : origin = 0x018000, length = 0x001000 - RAMGS13 : origin = 0x019000, length = 0x001000 - - + RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */ + EBSS : origin = 0x008000, length = 0x008000 /* RAMLS0-4, 5*0x0800 */ CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400 CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400 } @@ -66,15 +39,15 @@ PAGE 1 : /* Data Memory */ SECTIONS { /* Allocate program areas: */ - .cinit : > FLASHB PAGE = 0, ALIGN(4) - .pinit : > FLASHB, PAGE = 0, ALIGN(4) - .text : >> FLASHB | FLASHC | FLASHD | FLASHE PAGE = 0, ALIGN(4) + .cinit : > FLASHF PAGE = 0, ALIGN(4) + .pinit : > FLASHF, PAGE = 0, ALIGN(4) + .text : >> FLASHE PAGE = 0, ALIGN(4) codestart : > BEGIN PAGE = 0, ALIGN(4) #ifdef __TI_COMPILER_VERSION__ #if __TI_COMPILER_VERSION__ >= 15009000 - .TI.ramfunc : {} LOAD = FLASHD, - RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3, + .TI.ramfunc : {} LOAD = FLASHF, + RUN = RAMGS8_15, LOAD_START(_RamfuncsLoadStart), LOAD_SIZE(_RamfuncsLoadSize), LOAD_END(_RamfuncsLoadEnd), @@ -83,8 +56,8 @@ SECTIONS RUN_END(_RamfuncsRunEnd), PAGE = 0, ALIGN(4) #else - ramfuncs : LOAD = FLASHD, - RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3, + ramfuncs : LOAD = FLASHF, + RUN = RAMGS8_15, LOAD_START(_RamfuncsLoadStart), LOAD_SIZE(_RamfuncsLoadSize), LOAD_END(_RamfuncsLoadEnd), @@ -95,25 +68,32 @@ SECTIONS #endif #endif - FSymTab : > RAMD0, PAGE = 1, ALIGN(4) + FSymTab : > RAMM1, PAGE = 1, ALIGN(4) LOAD_START(___fsymtab_start) LOAD_END(___fsymtab_end) - + .rti_fn.0.end : > RAMM1, PAGE = 1 + .rti_fn.0 : > RAMM1, PAGE = 1 + .rti_fn.1 : > RAMM1, PAGE = 1 + .rti_fn.2 : > RAMM1, PAGE = 1 + .rti_fn.3 : > RAMM1, PAGE = 1 + .rti_fn.4 : > RAMM1, PAGE = 1 + .rti_fn.5 : > RAMM1, PAGE = 1 + .rti_fn.1.end : > RAMM1, PAGE = 1 + .rti_fn.6.end : > RAMM1, PAGE = 1 + .rti_fn.6 : > RAMM1, PAGE = 1 /* Allocate uninitalized data sections: */ .stack : > RAMM1 PAGE = 1 - .ebss : >> RAMLS5 | RAMGS0 | RAMGS1 PAGE = 1 - .esysmem : >> RAMGS2 | RAMGS3 | RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8 | RAMGS9 | RAMGS10 | RAMGS11 | RAMGS12 | RAMGS13 PAGE = 1 + .ebss : > EBSS, + LOAD_START(___ebss_start), + LOAD_END(___ebss_end), + PAGE = 1 + .esysmem : >> RAMM1 PAGE = 1 /* Initalized sections go in Flash */ - .econst : >> FLASHF | FLASHG | FLASHH PAGE = 0, ALIGN(4) - .switch : > FLASHB PAGE = 0, ALIGN(4) + .econst : >> FLASHF PAGE = 0, ALIGN(4) + .switch : > FLASHF PAGE = 0, ALIGN(4) .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */ - - Filter_RegsFile : > RAMGS0, PAGE = 1 - - SHARERAMGS0 : > RAMGS0, PAGE = 1 - SHARERAMGS1 : > RAMGS1, PAGE = 1 /* The following section definitions are required when using the IPC API Drivers */ GROUP : > CPU1TOCPU2RAM, PAGE = 1 diff --git a/bsp/tms320f28379d/2837x_RAM_lnk_cpu1.cmd b/bsp/tms320f28379d/2837x_RAM_lnk_cpu1.cmd new file mode 100644 index 0000000000..f84001e83d --- /dev/null +++ b/bsp/tms320f28379d/2837x_RAM_lnk_cpu1.cmd @@ -0,0 +1,78 @@ +___heap_end = 0x00F000; + +MEMORY +{ +PAGE 0 : + /* BEGIN is used for the "boot to SARAM" bootloader mode */ + + BEGIN : origin = 0x000000, length = 0x000002 + RAMM0 : origin = 0x000122, length = 0x0002DE + RESET : origin = 0x3FFFC0, length = 0x000002 + RAMGS8_15 : origin = 0x013000, length = 0x009000 + +PAGE 1 : + RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */ + BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part of M0, BOOT rom will use this for stack */ + EBSS : origin = 0x008000, length = 0x007000 /* RAMLS0-4, 5*0x0800 */ + ECONST : origin = 0x00F000, length = 0x004000 /* RAMGS0-2, 3*0x1000 */ + CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400 + CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400 +} + +SECTIONS +{ + codestart : > BEGIN, PAGE = 0 + +#ifdef __TI_COMPILER_VERSION__ + #if __TI_COMPILER_VERSION__ >= 15009000 + .TI.ramfunc : {} > RAMM0, PAGE = 0 + #else + ramfuncs : > RAMM0 PAGE = 0 + #endif +#endif + .text : > RAMGS8_15, PAGE = 0 + .cinit : > RAMM0, PAGE = 0 + .pinit : > RAMM0, PAGE = 0 + .switch : > RAMM0, PAGE = 0 + .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */ + .rti_fn.0.end : > RAMM1, PAGE = 1 + .rti_fn.0 : > RAMM1, PAGE = 1 + .rti_fn.1.end : > RAMM1, PAGE = 1 + .rti_fn.6.end : > RAMM1, PAGE = 1 + .rti_fn.6 : > RAMM1, PAGE = 1 + .stack : > RAMM1, PAGE = 1 + .esysmem : > RAMM1, PAGE = 1 + + .ebss : > EBSS, + LOAD_START(___ebss_start), + LOAD_END(___ebss_end), + PAGE = 1 + + .econst : > ECONST, PAGE = 1 + + /* finsh symbol table */ + FSymTab : > RAMM1, PAGE = 1, ALIGN(4) + LOAD_START(___fsymtab_start) + LOAD_END(___fsymtab_end) + + /* The following section definitions are required when using the IPC API Drivers */ + GROUP : > CPU1TOCPU2RAM, PAGE = 1 + { + PUTBUFFER + PUTWRITEIDX + GETREADIDX + } + + GROUP : > CPU2TOCPU1RAM, PAGE = 1 + { + GETBUFFER : TYPE = DSECT + GETWRITEIDX : TYPE = DSECT + PUTREADIDX : TYPE = DSECT + } +} + +/* +//=========================================================================== +// End of file. +//=========================================================================== +*/ diff --git a/bsp/tms320f28379d/Kconfig b/bsp/tms320f28379d/Kconfig index 63b5a0c491..6e4c810c5f 100644 --- a/bsp/tms320f28379d/Kconfig +++ b/bsp/tms320f28379d/Kconfig @@ -22,7 +22,7 @@ config SOC_TMS320F28X bool select ARCH_TIDSP_C28X select RT_USING_COMPONENTS_INIT - # select RT_USING_USER_MAIN + select RT_USING_USER_MAIN default y source "$RTT_DIR/Kconfig" diff --git a/bsp/tms320f28379d/README.md b/bsp/tms320f28379d/README.md index 5fbe825088..42ffc1ee89 100644 --- a/bsp/tms320f28379d/README.md +++ b/bsp/tms320f28379d/README.md @@ -46,10 +46,9 @@ TMS320F28379D 程序的编译和下载要使用的是 TI 官方提供的 Code Co ![import_dia](figures/import_dia.png) ### 2.2 编译工程 -使用 CCS 内置的 C 编译器可以进行工程的编译。CCS 8 需要使用 TI v18.1.3.LTS 编译器。CCS 10 需要使用 TI v20.2.1.LTS 及以上版本编译器(v20.2.0.LTS及以下版本的编译器有bug编译时会出现segmentation fault)。本文使用的是 Code Composer Studio 10.1.1 和 TI v20.2.4.LTS 编译器的组合(已经配置在工程文件中)。导入工程后,在右边的 Project Explorer 列表里可以看到刚刚导入的 rt-thread 工程,右键点击,在弹出的菜单中选择 Build Project 即可开始编译。 - -![build](figures/build.png) - +使用 CCS 内置的 C 编译器可以进行工程的编译。CCS 8 需要使用 TI v18.1.3.LTS 编译器。CCS 10 需要使用 TI v20.2.1.LTS 及以上版本编译器(v20.2.0.LTS及以下版本的编译器有bug编译时会出现segmentation fault)。本文使用的是 Code Composer Studio 10.1.1 和 TI v20.2.4.LTS 编译器的组合(已经配置在工程文件中)。导入工程后,在右边的 Project Explorer 列表里可以看到刚刚导入的 rt-thread 工程。本BSP提供两种编译的方式,分别用于在RAM中执行和在FLASH中执行。 +如图所示可以选择RAM和FLASH进行build。 +![](figures/build.png) ## 3. 烧写及执行 编译完成后,可以开始下载和调试。把开发板和电脑通过 Mini-USB 线连接,使用 CCS 中的烧写功能可直接通过板载 XDS100v2 仿真器烧写并执行。 @@ -94,9 +93,9 @@ TMS320F28379D 程序的编译和下载要使用的是 TI 官方提供的 Code Co ## 6. 联系人信息 -维护人:xuzhuoyi < xzy476386434@vip.qq.com > -qiyu < qiyu_sjtu@163.com > -guyunjie < yunjie.gu1@gmail.com > +维护人: +1. guyunjie < yunjie.gu1@gmail.com > +2. qiyu < qiyu_sjtu@163.com > ## 7. 参考 diff --git a/bsp/tms320f28379d/applications/application.c b/bsp/tms320f28379d/applications/application.c deleted file mode 100644 index 5c7b769a4d..0000000000 --- a/bsp/tms320f28379d/applications/application.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2009-01-05 Bernard the first version - * 2014-04-27 Bernard make code cleanup. - */ - -#include -#include - -#ifdef RT_USING_FINSH -#include "shell.h" -#endif - -void rt_init_thread_entry(void* parameter) -{ -#ifdef RT_USING_FINSH - finsh_system_init(); -#endif -} - -int rt_application_init() -{ - rt_thread_t tid; - - tid = rt_thread_create("init", - rt_init_thread_entry, RT_NULL, - 2048, RT_THREAD_PRIORITY_MAX/3, 20); - - if (tid != RT_NULL) - rt_thread_startup(tid); - - return 0; -} diff --git a/bsp/tms320f28379d/applications/startup.c b/bsp/tms320f28379d/applications/startup.c index da5c31e237..def94440fd 100644 --- a/bsp/tms320f28379d/applications/startup.c +++ b/bsp/tms320f28379d/applications/startup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2018, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -7,80 +7,22 @@ * Date Author Notes * 2006-08-31 Bernard first implementation * 2018-09-02 xuzhuoyi modify for TMS320F28379D version + * 2022-08-21 yuqi modify the entry function */ #include #include #include - #include "board.h" - -/*@{*/ - -extern int rt_application_init(void); - - -/******************************************************************************* -* Function Name : assert_failed -* Description : Reports the name of the source file and the source line number -* where the assert error has occurred. -* Input : - file: pointer to the source file name -* - line: assert error line source number -* Output : None -* Return : None -*******************************************************************************/ -void assert_failed(uint16_t* file, uint32_t line) -{ - rt_kprintf("\n\r Wrong parameter value detected on\r\n"); - rt_kprintf(" file %s\r\n", file); - rt_kprintf(" line %d\r\n", line); - - while (1) ; -} - -/** - * This function will startup RT-Thread RTOS. - */ -void rtthread_startup(void) -{ - /* init board */ - rt_hw_board_init(); - - /* show version */ - rt_show_version(); - - /* init timer system */ - rt_system_timer_init(); - - /* init scheduler system */ - rt_system_scheduler_init(); - - /* init application */ - rt_application_init(); - - /* init timer thread */ - rt_system_timer_thread_init(); - - /* init idle thread */ - rt_thread_idle_init(); - - /* start scheduler */ - rt_system_scheduler_start(); - - /* never reach here */ - return ; -} - int main(void) { - /* disable interrupt first */ - rt_hw_interrupt_disable(); - - /* startup RT-Thread RTOS */ - rtthread_startup(); + unsigned long x=10000; - return 0; + while(x) + { + x--; + } } /*@}*/ diff --git a/bsp/tms320f28379d/drivers/board.c b/bsp/tms320f28379d/drivers/board.c index b45b7e82c2..2c9c38eb05 100644 --- a/bsp/tms320f28379d/drivers/board.c +++ b/bsp/tms320f28379d/drivers/board.c @@ -8,6 +8,7 @@ * 2009-09-22 Bernard add board.h to this bsp * 2018-09-02 xuzhuoyi modify for TMS320F28379D version * 2022-06-21 guyunjie fix bugs in trap_rtosint and enable interrupt nesting + * 2022-08-21 yuqi adding onboard devices initialization code */ #include #include "board.h" @@ -21,7 +22,6 @@ extern volatile rt_uint8_t rt_interrupt_nest; extern rt_uint32_t rt_thread_switch_interrupt_flag; extern interrupt void RTOSINT_Handler(); - void trap_rtosint() { if(rt_thread_switch_interrupt_flag) @@ -75,6 +75,10 @@ void rt_hw_board_init() InitPieVectTable(); +#ifdef _FLASH + memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize); + InitFlash(); +#endif EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.TIMER2_INT = &cpu_timer2_isr; PieVectTable.RTOS_INT = &RTOSINT_Handler; @@ -86,10 +90,12 @@ void rt_hw_board_init() IER |= M_INT14; #ifdef RT_USING_HEAP - rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); + rt_system_heap_init(&__ebss_end, &(__heap_end)); #endif +#ifdef RT_USING_SERIAL rt_hw_sci_init(); +#endif #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); @@ -97,6 +103,19 @@ void rt_hw_board_init() #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif - /*this hook may cause problem for reasons unknown*/ + rt_interrupt_leave_sethook((void (*)(void))trap_rtosint); } + +int _args_main() +{ + /* _args_main is the entry point called by _c_int00. We define it + * here to override the one defined by the compiler in args_main.c */ + + extern int rtthread_startup(); + + /* startup RT-Thread RTOS */ + rtthread_startup(); + /* never reach here*/ + return 0; +} diff --git a/bsp/tms320f28379d/drivers/board.h b/bsp/tms320f28379d/drivers/board.h index 9f2a057850..1cf7ac7134 100644 --- a/bsp/tms320f28379d/drivers/board.h +++ b/bsp/tms320f28379d/drivers/board.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2018, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -14,10 +14,9 @@ #include -#define C28X_SRAM_END 0x00020000 -#define HEAP_BEGIN 0x0000E000 -#define HEAP_END C28X_SRAM_END +extern int __ebss_end; +extern int __heap_end; extern void rt_hw_board_init(void); diff --git a/bsp/tms320f28379d/figures/build.png b/bsp/tms320f28379d/figures/build.png index 4c2515fb83baff591a0ed802a256f475b359ddb6..4f6db2913db0878385c28faaed6284e87f1c432a 100644 GIT binary patch literal 20564 zcma&NV{~LuxAz-comA|O-Elg$S+P5|ZQJVDwr$(CJGTAiIp>V`-Y@5l`=R!(T{TwK z-eaz{=5PMzoMG~^Vu)}!a3CNch!Wz$KoAhn{_poIFks(DEPq0y?-Qs4P)rb{Y6|b< z`vSs5Kt=!rq&5crT@Uj68rD`^-2nsy>3bAXKj^Sci6IDx+=+y+fRd}uMJB8#((u>t z(`e8Dx&WTtp=05|57bk7LCvz#{K5i_7gc4g(tM3d^D}daa_@NHJ&IUaLp%yQx-csY zaY&0lr_cfK*LG&AN%p3f^HZyY{#G@*!_@?Dd-f66FmFCJ1A_@A04_)$Oy$4_E=VvJ z3tk!ceP%>2EBMdH)JhUm0JuS=l6W8`AiPwbtWcg3pqMKunJZ6OB$$*am@6+GL{0TQ zFa_>^2GWpw6?RL)eQ;@8a*B-Szz9GVSkBjPCBv52!Dj#F@E)%V)b#R%BREG7msp(GBx)1QnJ=c ze5e#8-GycUizdnX`L7bZ?dOnZ4QM|_?{+9Ys`|W(70=YKgkWeCpFtx1k$Uemgn{E2 zQMqS!;6%axJP-8@yWfe`Q8T?&knTXN$ug&k7h+ zY1gw@viuw+hz_2wObPVz{4J^U{;BIo*|HO)37RIPCp6nx-gu5YS_W$TUXfjrqMK$I zEy*+c41Xt9@P9;R6K;rO&WpoWm`*CzE(9);~>J7E1+_@7=RX_P zN~FbD@}v7RujnKsaL+W~3tw&IK}l?HER3FM8P!|F?FMc+!3Wr%9^CEzvP4nm+1XiC zTi5e8*9TSGjMGiGLbt1PtYGT)@Z~K zH|!YPE_~SU!e4-GEd@I>NotwN%YU~(_(PNI5}XMlk7J(a;8s!>8mUrF0PL~Pdsb8% zq%CP7J7VJ@a5~s!u7QmU!5Z5-<==_ea*EgO>J`#ff`3;YYdAkON#IjX%@VdtL|8|j zI7ra-@W6vm8Io43e|aHPrg)P+Qz`;~hHg7IIDL>a(0L*VUcd;~ZMMZS5AJ%3J}BpR zUWH)yFW?&!2xSO`aNk5tt$3s7^K?3ctu3Rsz^Z(Gqb)Iv0?2 z+RbB@nBF{lvI>*I^h*k+^WLqg=n6f}As89jZle(l8X~&%)kKiIdI9E)m5uiq z&}Z}CoT5CoPukWCLexn;q`QM@f+jb`(AvUEX-C;x6*9zO?>5S^2Kqs-V$G|_d$};!>@i^(V*Qj5Slm-DZmSO9ZSLTR z$_m&@OJC)H$mYGe5mpTc&|iwD&9o2qLl{Q-=e(6NVi^jRLz83?fKe?vX&$!$jwSky z^oYHF`+i7Y;|mB%TNB~L$1Vb!gd}HPVUV^K%lpm-1p~zDez>6vIs-yTCJeZC9c7w(E zr`N9#kO}2wS9a#tH=EQK-{WB^lhvNgRN!{@lbV5>YO&3HZbTPuQkCirFE4&&8p7)= zmtvkaChM&s+o%CRE5!Ym$`yh2x&Y9qEGqsWxZHYBqQwq`ETPlcG3rIPg#xt?f9=B1 zi4W=?27u6{ZrH52vIFIQuR~|b-*MOM9@j21QA^7MEyJ-rGCbXo-XTOR6$f^63IF` zuCdc#o?}YqOG^_JuUa)maDYz-_>U(ZV6BLKr2Fm1|qz#>B#}{TpJ?>~VB#Y&$=lrB{mqLVc?KtY#n~j)u)B1{tnAD> zGzO&O8P-tbjqT2C!}4M@4i@21R6vx~w5nuRwBGF-B>#3JQHpy05ccC>=M!IG2^^4s zB+x4mD4`+h`o*+cL`4eFbI{eI7u)&Y2m@Q~>wu8Mve7O-aAG zvPR`;Tk!K;+j|ehsT0)kRUIX$=-W_gGd`6POSR{>c+>RQ$w%2vnJ1Ir7k~GHx$zECgk~-n& zl4_dElt{L_wp=pY^z*OaY%n#|AW9DqrGloH=ITS`UCZb~!Sv_rB*}PXW3dwCH*_En z6J>lXf_D&PLVj@@EuJqYU?P+~k3bG`&)EGprAuk=(fMy*6{DKL;t0mr#)7z zRUi>VO-`fJY(`BsDoG&}P`K1y$9YgvVH>a^KcII0X$)ltdvkhQWzgR=U?4$#E~BY8 zD<#3K_(-sdvvC&n)!INH>`&XDFBUVE#iOaAq0#N_g<3H9@%D6ae(ve%iHC1qwsO}PSP!t}V})@tJ^#hx2ArRw?P#rnLUV9$?tpRW)h-)mNjoobOmrR?#f$DP?H z*drvZ(RT)l>8Z6cgM2814xa7%#|D*BaX4akZ-}3g^>bP0*?)C64<(&9jVEze7R?Vf z^k~DF(d^M9VzLhT9Dm=GxOwu?9d2i@KX+-CTf?IkjNGK84iv(76K|s=6oe|Uggyo(3xBW}`e zcMb~+BaOi@naa4izi()4v|21vmSU}{szRB|6NxAwC25{Z$MK%JboNAi$>(PN%uM=< zT?keL0t4|~2sV6<=H<_uC>fA(X(;GlUS5duz1|)?O!kDY{eAbqH?rx~eB-&9m);$^ zj^w(({wAJk&3{HYUw&w%Yqw>yT0PC?c7HhWRr``MVaLvH1Tb4}a4uQB`MY4o1Y2uI z)Y-&wj4Nu8-~3rBz1lswbGGlB{vE^A>v0?+;NvxSFjBU~p@K^ZK?*z~cB7XFzr8x* znL1|NecKQ_d6B#Hb&L0+vAZ&9+$Exl+?##a5Bb{^uDh7}OalUqOt8`JVk0YybaMt; zE1{d#iTEah;M_TX{dg-HrFoC@^tPQYYP>aa%tyXq|Mz4zUyRG~7$o}s{(h-aGh)lI zQoH@JP%3$2b9I|tN?aW4*B=lhOwi;U&1P$M>kW{7z=T|v5u9(YrkYxbWvb*HtD(<$ z$37uLs?fUzZE7=ZXWCV1&F6p(5q`)6SN$Cb$KLdN{qykE*Sj7Gk`MX$MytcTO}AIA z=?|@I3b`yi4%?lNr|qk`LijLmXJIm3q%EhJM(c}E)z?=RYhUn$D;`e^kBx`n-@H+$ zR|IcmQP*hfV6^!vbZcZhc9ROMCr650?1$p^r~Q{UUQ$4{lmM=yd;F&7b{PsdxCnT- z@bBY}jkn&-7Y2m!rW7AqH-`RK%ChT&jTaX1twAStXZj8S>;Y);!=q=^#Au?_{TS?Pv%ssNsQ-|Z>&H1bq z8hg|O4#(4bv^qE+`)#2^>}`jnyJvUSx#l zXy-t!TaICNw!@=5xEUiRt*QN~#8!Fs0~1^|CbjGB`k#v(h7?GhPB2I(IRE+c4u1xS z52(0*{dT7Zrlne(5u7y_7uP=ReBInn^iyu<3KJ5y9Tv*U-g8;$Ig4O=}fDNLl9 zTY$vGiA|plKd*UeQ}4+jHBhwlzQCQeiH}w z2<7|7b7vR)7GaI)=?)olh@b*dJ_^TM=9aD4nN33U`8?(2g3r#1+kxoJj4`&4&obvu zJvpyUV$z;#z-XH@x7~aTrf5~wdPn(ekQ!JlriqEk@!HVv@R?a^yc`%y-p;$*`9I&R z_(si{t8yJ@i;MZvr-p@r?1U*i7c-t%VX54^8<12Ida9aue{h_Qyamny=%gSCxkI~DFjE#(qjf@QL z=k_CZCLG9Gqd`>3GWmbsn<*9a>hyH`*)gkuaLk8^+*H(irrB=&iQ`_vyT6e|S7W)3 z!Ar)pCaaYw)5xCSKH>qa>9x&gM>{f^{sB z5i~HEZ&ncxWB9BQx>D?+WeQ7a&t>!HKwfAx;h3%E0J%c z^zwE<*lo7BeLg+Cy?Jj)_z8Dx@EA9uq>}nwirF{%%q7oTr!1ExiSsd%f%Ovs}2b+xrL^v-D)7?(1wNECbrGOzX2zzuIIs-^}OW^t7Mw_GI)hWM)g))!NBwh|! z;i08hjSQTxqdv565V|GsIU*q}wqhmRD!IL>%7^Xa#`ep7`#tNW|NV!w8*Cu*%Po^^ zk3vRvr;VK)B$=1%!!uuZ)YB{0V*X8l_@2uZ}$q*;Fdls$Jo#i)COq`PLKrF z5_zNEdY9|uE+oz4#HYK-h<{~*@fSD!!SK_OwXbbx(D$AQ62z3wVrz_iG(?DWne5&E zIQPVBXLYbrYZPJk;Yr@T=6;bYoQ=tu9le%Mn~!D6Y6lw!ubSg>wI!8IJ32XDU#?;` zBlVHa``Vu0t_Ys|?}8^SGfKVPYmqx%mal;(M~kd52E^;QNyX6rGrx0Kg)9SibIai9 zI9IW~6NLD&sY#>|HHaoLY}C#1$aLY>T*hP37I&+rzlABpxxM*4>29Y>Lv-HaWvXO} zfB2S!n)gY`$K9aHVE5uls$;h&6hy${gzI^iUer z-Q|mHakBAi_a_ewJ*={DJED6NT)f^+IT0DzVSH>uLj$=?S}foeGTxNcmTrfk_ItUjO(DF@=!HP~q5O{3zz#a|s3}L~Vaa0*xW-%WAx> zFAr#OHn%s|$E-Sifbp-%v1+j~O6WLPSK=qnjCHgC;(@Ej`*TJ{#!5=cm-Y7J)#}+~ z>NuKQX4QI&Tj!8W$3|Ml`rZ5zIx~9LXv3~*e+#vq7XDe!HuG2Q-;-=A)t!`+qr3jt zEuM7tCSWPQ3EEft^4#o>+W{`s@czyVX|emVE`iF^RJSvO%B?Taa2)^7MXaSpBH$m>AvG75rUJ%= zP%a8@k(P5y0&y+VAE#bjd4zZ|xW@P~DMNKP1@+#CqRE`>gyQ0OFkAgSrZQzDB&4jY zEZ0M{kdP3u@0Di<7DSP%DDfPz`R(Sroi8+s(s0?WIk>o_FzgkKQG*LRCZ_&gY;rA? zDpXf_d5MKUJ(#mq=#IAvWCqKg&yNrNm1-c-4LdE>~}L2ryBCMg64bp>Nk3G+(NCInwos`lj<2_U)FI z7Dss3GyAc^vs9N1EsaI1nVE8<{6wL+b(LU@f4INE18DN=C4Ku2;cRWJEsW5eZ#M{& znF!DUS?)HZ_s0@={gzU)(-TwJ{}#ia-6#{)6Tc1wH>fQvijFV&$YPkwR@eHHt@XTf zWhOCV>g}(zjEx#J`khG|2~rOK+fpWc=itNH+g+DSO$N*^Dx%vN&E5wcR(^z61iW8r z5()(A8c@|%7w9id17Su-#)GLkQ^iPwKhppcuJpZ{GO02R=*R3gAjaHyaA z5$oH(wM75`#pA#*hb;6{o({65L?}^LFSWF+Xs%kV5fL32S1vPmMqL(ji>2SIAADRa zTdveTs`QA#xQetmE+{k5t@PgH^!VId?@%Z|@7TLP&VP$0eEBmwJp1*QdY}M-Q+Q;g zT7spOt*YaN-o9(@1+Y6FZuOfS?m9W%D4=B6UMys}5I=aF+f&`v+>sY^_m#l)DubY0 zDC_cy61bc+n5+88^8EdN$cyx6p=34P&R{63o4EH)yF&s6IfzNh`s+imemLs&VT{J~ z-o^1Ys$SKC^-4QMS1C4my5ziKBLtf?A8Vcu>^lG(lF-e(dFu*=o$Od+eY)PdSB{Np z99z>cGCa{2S?&%47_&e;5kB{%EysknCuAtCvKbUOF_dcJIZW*ZSm?)zi z=KQL2y1DoXoz0|qG-5N<#pQt()(GP9cy2ZyEZy;WH_gY;_54%E6(ZPhe<&)3kZ-G0 zkpd5X8?`@JLN1wquij)@kYQ_h_~<)G%H*o2@!qwdprb>qVlsuu00Xp^l)xmm`S^Gx z`wS6ucbN7w(xCrUh)T;7;Ce(>avE&#%j{fv;UzgH;23GXIulc@ez-E;?udJ6{Ib4? zp2oe~qq!5So%Fn>9521B_ta#6Ev~*S9CSHZI@xMWd|R$g1YqcNe&p=aD1woX@Qxar zO!6J^{dS#OS}Ut5Xi$)Oi@Vt1$vowyrv$_1aeOe&G-Y$;riUOmc!e>#rZB4Shg=6I!J}Say!19KQuY$@U*2k&@U`eKD5{RR@q%QDqga+ zA@SSQ@*>^48k+slRd3v6U(D+(P#8<_UutHU0<(Kex`+&Z4)Z}o2n~vE@@G^MD zif3-bGu0d7HMxcYGdxvD67^SssJq1UwWimC&-3b?tes(bGkVQ}x#)-n#or*iG7{`V zOy-6C^QvO_#VJ$UeA&j-$Vzd%%Uv{nuA>aw4;h!`ejl7d3*Uk;8|!(pCu?T%>++zL zicyT{TKJ!jO@k93DoY;`Hl#gp*@0`c^`N`HRlOPR^5gDy;AL7^6x5Q! zUnblLV7gZ1^7X`q7YYa6T!3DRxJ?eZ3BX4&J?5YyG^y_L7T_DUf$z?Ql0$=K0VGHF zb3%E0*zPy4KH1=EhmwJ~f%byt&J5!WqNLxa2kn1s>1_5E;$Y>L)qxdtjFcVZmeEd^ z(N-_CdD}T553LcPR=?Q4Psq_dU&=^JOP?)O*5X>uHCc^Xn%Ubkwd^uHrA?+Xn}|mK zIdVJL(Jb2GvD*twPF7V>QE4<^wBBf$?euV&IgE^q^aD@&JA6w;Mdx93Idzs=SB=nQ zYxX*vT&*Nj4-`dlF#MA1784Dsgmk%L*Wu~7ki)b7O@G=v7Ehulci<-@rQ>loIow=r zSftIJYHNLN((U#HLp1yMV3QB|-Hs|>Q}Jk9hwxY}Q~M0MfXCI5i(&h=|8(AH>jhCmjn?;Ky+*;BA2p)^i=Y8bZXkM>Z7E^v5 zkXcxTxj}gUQ+B)Rp@W9I3f1l`Aw50Vd*%8%c;>Hh@B5aT9GGf8y*k3p?7J8DB_nL- zi?ucuYZFzQ$xa3sc7xbS*wM7K9q% zaAkeHxS-(q^%X<#>;806AOOOq3x}HiHOC~i`Etw6M!=K>2jRi(p>W$r?QBiDny~B_ z4vF`&!FV%swB=WAMMZ64Tqd8}UH5hJn^H3|$r}{$(~m^V zcly}byoldaxcUany2pH_P9}wryZ`!7pKynRv%4~{qpf?Bq>X38l_f&sdA$d!XcZU- zRg7X*yAsFRB5RG5oDZ*6dBA*24Msnau;RZ3qXA{G)`ljG6_**!X2Eh>;*Rgpjqwh1wBB&S2AqFeaaUYJ60#>l6s~bUk$6AuJ-xt(i2msS1Mk(_^F(r`4Yx7t^&H0SHg#;g%G_`OuAEuqzx@_fm%2Q>KaoBLLZ;Ra13u`P?f zRbe>7Z|PV~Hk(&Q>sukVt;d*MLwimbkh3sY6vkgNxk%MV(tp7URInavjs+-V68fB)152bD4~{D*IR zllkHpl%ADUrC@B!5x6^{A|-(NdfVrV$MgBux00lE$d7mpIqJ*JyXAg?)Ze*&;BL?DF*AkVv(s)n2V=Sz z08QNJ=J#;9YK-yc9JB=Sw9ip4BLTh~@H1jO_gL)PEPmk7T3T8f&DMxM_;`52eDv=upyg|F8i&!wWj?V5bONX9BUoy8tq9Gi{9_ic1?CCuqGx;Q>OC)njK zb?6zq6YqA+?~@tAqR&k9ahtq?3RDb?G&g6VqRpeJ&(fBhkq!st=+CoMRe+)8Kc^d= zK%YgR2y#Qj3vTe>SQQ1_i54O1GjUl-|7^1E6>?i`koy1zex2n*0>guaVCOb{yy13z z%LnACae`5jNGL(}Vzc31nTe|d&HnYUG-49c_wgi(G`QQ9MO=AMu+h2N?xQNc7HH5V zgJv7si!H-yzD{>*%%@s14(p-cER%7_>U5ZBmYdZkDTY}ESlOXSxU>g?bNM%QwMEkf}phf`&q^W0JTC+iv06wOXV zV2O>5HYWqlWn0a~Br`5F`q37NH>=7%IQP!+u|l=R1^HyVoZU_4-popM2BYV8Ee4ta z@|1qcp_Fu8|0^wXLYnqEW@9=B)r2`jar#aV@rtI1or8^-7QYsZxQ0A{-S*cngv5CD zZY82bf4@0Dy|4%`0qySj<*belPFGp5FFbjO^5JRN5hOiyIIb+>7G4N+12QKN(nbWt zb%^Ik^>lj{U_%*vU}Ki%wnLm>>(jhAO5bVmu@Z+jpX*_7Ysvv@{;sR5qvB^jR|y8x zoC&4)$)%KPXfm+3M?c&s5rT(dKqSBnizSioBT#xN5ReuB8jVGYmE(lVBKT*K+QDu5 z5n^Vqw2zA35o3(G|DiGF3<;gky-LmAa`$bHqSVVci^yA8UA^_lS6!xEnxosva?0mO zoN}eW0J^RJMsgbCDf;8|X_u3uOOMQS5C{nx3_T z5^H*a!2KXOSYP4w?^PW+71tIB7WaYgI3NQaIyb&W(mYcG`u&~>QI%p=c#KV#Hv)w= zCnG&!wv4_sd7igIxj=VKW&HQM${>7*@dF06Cf z_E($hv(pfTH<}Lj_V~1$qYTuW9OCtvY2ZxlK zBl=vkXR<;u9|yeTK`AV?RjYA{17f}TX5;rHnXRE4NWcmZgMXzpxV!RpNovyx5qzUJ zfvWB-qk^T*12#wTq}S-L9nag2ju*~&@^eK1a#Au<^vk-8!YzgU8X!gDZlnmtEGl9_ z6z{<{186;;=0R2YQICg(bi2X=c6vHJGB+gOCl`G-a#ro~0;s0^`&Szq#k#3X*gAvI zG@~xB;Ka&lwjI4qBp-&Xo1%Cw(wZxmYb}n#uJ-$nF2Z0f9#WEhO$Y{zmjrh2xLq&O z!stSAQ&lNtD##HmmTtS|G{PYwle?zt0_yp>KanHCnmQU&S|VLIJBf^G{1Qqr(3Wc+ z`trM$m+18525jJZ$}tH@|4|nObs=JA3bnpqRhlcH_)oDlAutrsOcR(5k}#ubHoE6& ze^2poAqZu}z>QG8;Cv+wl7eRtadWrRW^b~Gk?A}#dD}!xKL7o##rovOYU__%c8=P` zBCq7#5x02F>e>V^#B?0nm37XAGL?MJ0Avs7Gm6#UB`RyzhA`>DKif@hcR;ojqfPuE zL}_O9`H50u#`7Bs6Jb^W-mfZ^#Eb+HJb+F-$#ko{Xqcl*H{i1Vo+Yhj$kNAldwU~< zloG?BfW8+leVf+Ud@W8id&={Dl{|J~{3okAEXdrSqyB+P?JUfK z(mh?MoYccF<3Q2UT*P5Yc3q!mCOB(Z{_>KPJdrHFvs{{K-CaIg>a@_O-Aa#e_#f4G z2g5>)erLTUhXW}Se0KF8u4P%!8c0Ocf?ujSRR4|!t`s!cgo7$)Is1Gls1S-PA|?2| zPB*d|xBM(lJ?<%Ta|+hI)9StYGdlW!(i-!-&db0Lq{yKYuA4f`)7U zwAdHt0;W%%;lR!bW$Aq=C5~_+-em%zfYI!a@(qV2@VtBra@mZZ8N1lK;3a@9A!>{DZ7w2ZYiFO9;DI#2ZPqkpYLFO zY_eF1Wlu1WA$iXZxFv6q6nt-=4Osv+4ah6_B;kcYitsQ|k9-8(MTtmAMQUHVJJk?n zj`IJjc56H#QezX7r<_RIDv8dc#4H^uC3N*>@EMbuM;|_~&M)B+Se|puSz>Vp7C1(k zYZkDq!!uHH_ozJ;Z9EgWAlaJlYO5m-+O6*@9^up z!V~zTR87*|6rG(-B3GUoyCwV06UdkdXd4d=->xnG#$+q%;P^dVGNV!eQ+SzX5Y%@) zXn5GnjrV^zv!|`cC!4ngY#QS~wG)N*LJ$wBz*!Xmg)Brzbig10sHm8qpP$ZRwzsXY5CEdL+E{(cpKNV*@4#2HVfHJZ&see$kBiJ&zUT4_A}UIN#7gG*H(4IA zAJwB_zEvSFl!|wyA;9!|4J3 zA9dcP$RaHR25TlSkK$9$#cDdwHDk8LMrxh#G)stAXlfu!Cd1Woy7A~XKw|iKOt3)C z3O3^tV>U6ya*rXhCixXgytYlCX3kSIh~`r`G$~U6bQP1+=32y^JY1AgC&uSQx9X+c z8pOW%j!lmJekZZ;ovF0@nhlUZR4CL)^fHloC)gqXhFY_y9msqxC#~%j`k5lZc&Z|p zZa~g>Gym7_F9quC&4g${9ce|Go&szC`Ybdeeki0SZJ}#~2Y&m3BBd|Cgw0lmgjR5k zeedlR2EBHttwcFe6r7EfKgtx?A)adnpo0Tmgizl__}4_iF6h8G>Mu{!e&KU@DXLfA z(luQQS3rGcy9nn(Mr@gtZk&01&u?Bw)5JXRsCaTRGW_56fvyO-4O&M1iE?Rkohsmj zZ%~=3=lLsOLEURe@nT3UX{Dle3v%WwfR1-C$0IS4%8^2zJ!-UypnDGTjk3Nd8bh-AdMxqSI2DxvkrSFFy)!drw zPCo(_VYDrm?s62{a11>Yf1f!d8lGF%G?9gY0r^u@R5Xj*4K?I=bRvk^hTFMDA?a74 z$ic{3wbw*uYq()7v3FXCxq>D)shSSbhgzwCfCy24^ezY2`g#=B&t!Z6{Ojb5oiQS( z;nB_81dJuhlxowH+Tnbp0a(Aw_266sMj_cSv$Tht9^?kkx=`z=*??wJ7<{ig08nTV zF2>?geHAIc;ZovCThP;!OH`<#_-rcoM#&~BDmzF6jUw(tHT?sJ?BU_T$;k;)OjHyK zX*N3&8cABB>bAE?VaUfQt*96WWhy-PZx0nS6?w*e(54XEm=W}gL9q$HsKlPHymPF= zyb07?KZXdum*5MJ1>Ic#P`g->gP7)``&QFThwOeu z!68mS_b!HnzM^|6Bo+=S3+>M+V%TYhhD)2MfKka@C}tD2To!|sAueH6sCmC}KN%%# z6;VfR-U}&ah<)hdO3V=FDbbO#|p^N}Z{FvYX{gb*>rVNi4tWorG!Z<1B z1?SU?|7*W;nKw1Z>$&qcNB0U;@v`VfT++N?0Ls|Xi-=`40j-GNA&d!J>U8#~08Z(* zPD?&l#X@+3ak9$JE_OykxG_>9qMXQstnpExZdV=5%6({ZcJqfiC@)A&;ybDRelUtw zBP|v~Ame|(v$boJ!PV?h*~$Li>GHfDXH|xNfRVt#+B|o4{zd0)EbgfYr5ciU z&{YVP&HQL9;j7ElM&Kk-z>1P^{gJzPnqEst$)Hk$I2@wBAb#IYL!0{} zOob!rBVCAn#Ed_=A8-#89BFn>0i)m+gE5%~!W6yhpzJ3;pJ85LOGhlnO+hEhRtFjv z(`jSk0r<5Im^^-=X}-eT9tAJr$-nJFMhOOJ-OX!GvaclEhgcS&-Yd9Tsdxzea44z$Vi|B^^ornQ zG9tWA`+;T~g8)bo>ZZ^Mhut5LAPkT@0p|yy#HT-PVcknT$slFoq)13~O{3z^)qD-z z^uX+8u znMM%T^tU!9C?CO(=w2yt7Z3QZp*%)Z1~$n}M+pM)zuP`U`I7)LXG8^tO4o|A+z^WQ zs5K4>${$CH-#~y<_iBjCD0aSc|Nl7&wF#|@Pw8S_*UPPVIn9`;wOi%vnIZMLmphf((Rc>iw#)b zE!m^{H#ErMI#8Rf^(r4VO_LB1*NZ*nuzk0rl$NC^O5D|3H^Qfgatrq0K&As|759qe z4fUShcV=!hUrhN-e!!`V&&E?Nh)`MeN#D+UrBUfaNV?zsli6bmOoIRG(`#;Qfw#v9P?^dLi6<;EVHeRMEYWOU$rN9tG$!U^ zma;aBxp{a<+D3{Qm&*;Er8ENq=i*4jLWfZ#$CcTnUka!;Em*H>ZDvwOdBf@C|HCV8 z1v_7Ap?`K_aN!P$<#DJ7x-SQi1tjE=@StVA^;&2zP`q}I;&H2$B>Q6$IIDRN>tV)b zsYO3&pZ!r{MtvhM)qfk=tb~Y$Q?*-!7;B<5kM2fzA+GBZz=guaf5$VwC@ICgr96Vo zmZwxNJq$n8#5L-^rEoc* zj}n2tb$!j77ZFdSaK0>)!ax^sfy=Cm6;ejjk55K=PPmLjm zK5G-4R6jJ{yi`va=7WWIOjU=MZ#94T=d9>NxJ&@p!UKqW`Sa0Yu_s1QM1S5stugqx zshxLKend#7mkg>os`ceXsFcq}2md*JK}2D^r5&FmH7=cntGmnxrMQOas@J_gZ`!Fy z$G4mt6))I5w77_lhmDQRA?(9M!10T$bqqRPGv7f&-qc9+~>5>^G(+ ztOGndLH&?H#>g!~)Yx9|ox3!Q? zE4LXBzFvV_Q~q>J_@}#ttzNYbZRV}igmX%Um1(RiRX)PJMPhM{Ai*&%+^rTJ4=&Ri zl{@_!-iYSu{`S+-*>W?88a$ro^oUbMUV+y=7+3yZPrz;#74o#u*?r(%r;z3cU3Mr|a+V7fJB*Z`YwKMT33f^QjEvLSV zCKu+gGn*`1&xI|M?upf+uY0EQ91)=JXb+o*Xy->XeG^P&sclcG^YmjgozeS(q=U&6 z1?Oti_dDppx^W9|?$4IfTP`o*H_Sq>Xx*U_jD}b-A$!wQ21!3nX_eTpM#(KYatSyk zOR|5eL#-D1dBJ%3_~ODEwSWHe^|709z=$1>fNmcAx@{Dfp0tU&Wh;%*2U8bWtVM-m znT4iekRl=>>#9Jt7lfpkR%~0T|^KF*M|+St*`HcN@XM@ zjBm-Dr%adIL&JtR9a+m+j=c}a*XqJ4jL4r>zwenH-1OPdvb`Q$V9InyBq|Gw=;cOG zS^`?5D*?FZ7~-(1b@p7QoFu3$8q1yrdE9G6ha<5KVk337 zS(}X&o!QLvOc|av>%;n^v>l`(#yJ=}|JvIO%TXM8A8&U$ps@vDvD_D1_>1Aih!VMZ zInx%7a`6i;JW{M54ijVi0FIg)Z0^mJn|(W-h2!sOw>q1!cQcrW$&X$+P0`K|r3%+ae|3sn25N~v(<<(W% zY|b2ZQjzRbfBSow7nkK28QL?$c)r-dy(> z@qg{j+&U%9?*C zXSI@Y@ICO^yP9=@hQsrv7H^$!U z>X`6u9dl^z%Ap*MxSOz35zSFE^8qeDJs# zhxP8hX#{#;lH&pPV#BxPN5_h@0aTMyudKl+x7RCDqXd;`zG;GS*5~eKf=kct+C~3j z-@01*z8#-u))cw19ZpRT&xu3l9rYi1{9o>dt<7YYGfw9$M_w7uwu`M7bKSLU9*)TQ zR=^sX{=R!wYD7t`+SVH)GoQ9sSKqD-R#LI71ASxy<~>}lv#pzXv6icK-0$|?K|I4v zuHNo;0u-YOla%RsAK<4sqMQ*sy{#^p9)gpl1uyE&Ymn04 z$n>prfLhLxrN{i}?y6z1aCb#WZDLJ=pwyG!lMHw}ZZzQ4;;Ny$(PyGRr=Z`NdQ}`9 zC?y=;=f%f+`8c9T7+I$3e~$a20x16W*ctzk?xXgNyHMUOIq5DwPoR72Y7r9^?JKiB z*U-7(+c5Ym&WT%YNweKZcx&nn1Q|`a*Ot-Plb13kP-NPze_mYRldE)E3Y0@cgPPd{ zU`+h%k+@~ybTWeUVd$d~g)^V_PbAKLWVb#tWBES%?C$x3fW&4y%h-ms$y1D!jo8N< z8$Uj#^K5jqzl}+tzOy=@%-YX!!k+D|*k5Egmw3s>X0BcJ@zd^D%+fYS52<3+Fbp*SjQ5qGW7C%r^@ID@exo;vXX} zrJv#qQiRevqQ%IEiE;hSIII_NTS$`J(g0H}F-lkuJa6l6gnq_GK;(%-;Evsy=aSqk-OOAJ`@_`!5PHU? z**(~+2S5LAppG~=6JRP5i!sS>ndd)XLEe%R9)!B98yc3w^*35TFwEi&ZF`*R)W&UT zao^{1@M&uan2t^svkulo8>O^`z6`)U&xv`p1|j-;RVXjLe@S8;pXlRKi&JnX8&K`J z2PXeYQxTE8T)WI6wv>58bb`rU8AFaBFWzs*`7dt3sb`DkL=##}9~<)WobTm>=>eQ% ztZ$m;W~W9n9Nl5H&L|_rpNowR1Ms-Q*eS}!{C|lO`sT-vn?LKI7d+T8Gbt%4NrrFi zUlKIEm}u0^^_f)zIj#vRMW8f`npk$419mV|NWK{QH|c)gvCCp+ z2hik@yV%Jj+5tTxf196$5|;gWRLHj9K}BQ+OFs_>4o3gW`r6U6g?}@1flX4)k(Z+) zo`A!ah=>TJpkBAzI|uGhls|6B({b+dh_PN6qGCL>*f*)#|39QE-b=5-i7|z`b9srB zB=|O1-+&Lt3uCx>0w&+!soz(Cb?gRCe6EuXbD@3wVgk)b>VYjJyOB%rb{0n$w<*-u zFSKwZZo+McN2Q#JDLGJ#$lpGf8c-1ta`RN|!R2_yat!)95`W+PuU&~JHeBqItJz3Q z1AjdlXJvf4)-T&a(;B6$)k5<+-Y*Lddh7o*a@J36XzLori))}rDNx*sOM&1TGz6y< zDVvr;ijRxk7wOUY5Ev%n>;lDR$b{q z734{ik>M9lYR%kh?IR0LyR4H9iu6N5Lv0?LT-K_hf&dDVq|+MK5n_-`qMuO`X?Hdm z0d!9Ai$NSoqk94T7}GayN2`~cR^jYkY!ePtdV3UQ1;pQS|VcZaq4Zb&zZd3ZIlu5(VwQa-KI4aL=srsUuW`^kZ_|a9Qv?e=2d`$CLIFW)ABy&*`CZSW|o8!Oy5Owi#v*dO_We zb9B8cMVDiYL3j8>tn>R0npWu|LdDA7;H&K@VRG4PpyreE1^lWHMGMt5z@`eHgkpxS zX68k<_4Za-4t)3Tbv!cZ6u++E++7dsqMa5dREJitVtQXSC0ESp)tbsY-Y??EDsb#8!^0S4;I*e&8y`L{?;JEywQm25^Cjc7-BX zwAqw`s4e%oRx}|fb&XZ-XJIOBlCU>d3}${%>Uki&;n&PB=Jv|@#-ehnkAw!)eD0o0 z3zUsyB+g#343d<(n15w1!cfsb#=>+CJ^h0DYH`8JIlJ)+O}Pr0n~uN2+8<9kBgZfJ zA0<(fJu+2F6#G0X_2&MPdoOM92ijtw+r*%9s>`_RFEL!`EF2VqhhC~Bi&dHQO$!mJ zUY(d!^Hao-sH7Ic5mpj+D-Q%cWT>~yY!^F73)`JA6Lh@VooW^^t$Vau*^190eKY#} zFuNr@NHnY9zIEPtxh9rS{&jdPw-hW3_>#>TNCoISNS6~N2E?IZj;WW^@pI@4FE~1L zja{7o@q94O@%5Sa!{*he#GY_OE}?-R{VxdFqB#;ZBm<}R9Ddz;e(dHb2;*&FG5Mxo zlRmJ>1(e(b>myezdg{nhR7vMZ4Ff%fsxC?co5CEY{qN%xBF>qaW%yNrcZ1Q1H?g+w z;;)J$V=r?GO@l&Q-fiuAvHa#H4)ak;8u@){zmOQ^;>>v0kXImUn*!8Wol5gfGnVY! zq=Ln~sp7~^m*?P-&d6aTTGWevh!33p3Lsz+VH29BR?he`T^>6lEJgy8r|xWCb9l?| z?pb?)sUI z<`Ys}Cp1jp&7GzYF-TrQQ=Xk)i6KMz!79x#bA<20gYp3TJVm=NKSXmq7I5!!i%;VHXP@6fkG8u;|m}*05iUQ2rWFrT$tP1beCme zjJjKRmI~1<<`PA0x4wdBuM$G+W?a%G&i?smW{mR>bt)a3D@;%XE|^?MG(9Jci96K; z3oukphz@JfzaNwB<$M4n7XNC z&-)*Qvjs;+WI`Z%TuG6tefs*GoTE-gSyCP_iyVIRR}|) zIxly(Kl}VqZJUf8sb%gP)LnK3Kk-t=0sWJFY3pGa3jOyYsb5_6N@INnj*K4FcpXqr^UqB#F zz|of!_QbjR7|Ga<9R$Xz!+svap3B$EAIV-+RBwUPmurnH8G8hv^`pDn#cU#-5dR6jhaiNFHBOvdS^}#6Oi%U@p3yW5dy-@6P&Wod>9C0V}Mn|2CM71?LsK-$w zH90)(XPeh z?-XTGzTHh{RmknU@4tC}38ITj*V~JOx;oLTjEoG;;`iKArG{lj=sg9Xj0{qMYv*+4 zSfV3AF_3_Oz(k9rMk}oC(&b_;^JnvQwAn53m%MwYcm^YA^F$*w_=#z3hWM0|kAFGD zSJ^IGZ!;UXh?2T6K$_3dT&}l zpt7*=D-X8{XG257#l=Ov!z`XgeRVas)PU{Jb*DavuuoM@O^K6Y(cA1tfl~XMlgZwW z7>ieaJ7-THFU=CYJ#;Obn?Ene6};K^Lj9QxkX?cU&EpGQ)zvcu)k_>}Krn8sZ&~Co zgR4Zbr7&D#3r%?`1x^xAsq&)+&36g1XzS7=H|h-UJ!kw6TU8v-UupA zWEz`7i=+?t+mkzL?N(f!yUok)gf=D{vTQBg$J3Ft>_a~f)Lq|-|4Md30@fh%5KZ|W zu5`q@5m?R29M2}!%8fQ~0K&8Tbr~!b zmZQ7Ham@tY<8t8r_i>xXQv(A7QBlOk#>U&z3@+NhC9`^WM_SRtt;~cwRMwktAONz^ zwF>WCe#rVA2MDET#g^K7_y`Q271gs2B^P`qD(vS_M+&t)2h3L<58AVZE9M!z7^y5g zSg8G+O0ky{Kt|*Dc$`#y7`wYWvhI7<*I>v%^#FWZ`@&Y)BjZE?*czvd7x#PyTf4$Z zbm)gWlN4odw2u zqs_mQ-5u?OElD?&nwNz}4&GXOAEg|&f4|zpinSwIsCV#OAE3C>oZ{|o|DY>hb`tIH zf!03Jp0%=u#&sub5rv7J2SI(3jPa}9HhD+#F#BGSQkLkGydpEC9u_b*Z;`Y{^Kk`BQ@yu?tfX@ zO1IHX*7`{X!LUdSzs~YwU+K0ksoH47^+&u21c$guk^ZA?RzzwMm&i;QdfZk#ZQ3v! zdiQkH6#q2*vW+xY*3HvtY3%P`5g!i|P0(#!DTaX_JN)x|RDF*di{A)@d$_gofl<$HJ>BfYR`8VT%|a1+Cizx=?AjoZl^iD(bkoZ0 z==aPxtcD;Mhm%spg{yFN_G?UqK36jSDer%kUSb&32*=LYY$XYIdb)Xu?N}YzB_DT3 ze`ITgM_a#XW4hJatMgAYi8VDRH76(fDNTU-F-28fFWO!XPa)a79mi`Y6kZQ9?`| SJcTv^VrZ!7C|4+21^o+b*dVX~ literal 91851 zcmbTdWpo=&6E$eZi4$|oY$t}8F=mXJWoBk(W+!H5W{{bgWoC$(nMr1*PkG+mKf7oD ztj?LEnb!2QrmMQE?yag&Ie-`vJRUq06cmz#xUd2g)CWGuVfW<&qy_fF%K_vI+EGDF z5UO&5;0SW@(NsW201B!m8sSC%6XY7sPF&p)3JSUR-vK>nTWkac^$wH}7Ep52In9Lo zg{izTZ~#tL#uBj;>hqS8mS&`3lCdA2Jyq6R-H@yksgPb_{n;>9&_C-%b4HU`jv<3S zEQez9=*?S+}EK`M)>gOPgeGh-9&2L_?_>*uL(F}w_hybLvZhw9f$Mh zl85AfCmCEHlIf8lZL>_xPWBuG$VE}#Po@-pz-s3@-6NS@+pX};wBrRI!B?i%bN-p5 zrr)uH+;rfw`NV`2DtwIjb$P#g*daP71oqP>eV@y1k@zXQtxXhnY?QPc5f;+_25Z7I zt&$>%efZ>xM9j9(ArXyL!S(R`Y`avu_k0eT93MZMuh3j+JbUqPqyEt5Ie*PC(y7OG z+-E@W?~kogX8_Aq{x*5?-Z{){VjZEeERunD!M%Ag+J{G14s%SnCZL0VAlx`Dti2X!lwQUU+g6V5@ z!TS2-Safg6(YaR0@+J4-e0chqs*E*Bfb|f_9q=9WO60|8<1g>BPr3UE?!D z%rH5Ay%X#n!8xhdqxyp>^_|x6@X}<>c{v&Awc2}->VB~aFl~6Z`x7f=S=>u<5lp+^>x6>@HwXcrN}5p>)qk0s!+zPD6I!)fO7nN}PIk z117*6F29e-dp?44nM;Vh{$Tz!Xo(@HEFLmeopT!l2Xc_WI=9tPbn1|N3-G>~#S>EhHqQ zOpV!2AJ3*rYeM=eDA{X5C{a9_kHqj@I%2Bh{(kbsa}Cpgu+!|pkiov*BKIP}Kk|_0 zddfGJ!+sx=={MfUWPUVXmB-PVay9cLPwW*T%_8VQLz7m-VrAL=M_I*lS5d$_Cq

i4u__~MmCV?hKF)^t=9&KYKKZI$ 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%0Ab66>-? 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 diff --git a/bsp/tms320f28379d/rtconfig.h b/bsp/tms320f28379d/rtconfig.h index ddeaa7c61f..ce045ed9ce 100644 --- a/bsp/tms320f28379d/rtconfig.h +++ b/bsp/tms320f28379d/rtconfig.h @@ -53,6 +53,9 @@ /* RT-Thread Components */ #define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 4 #define RT_USING_MSH #define RT_USING_FINSH #define FINSH_USING_MSH @@ -121,24 +124,58 @@ /* language packages */ +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + + +/* XML: Extensible Markup Language */ + /* multimedia packages */ +/* LVGL: powerful and easy-to-use embedded GUI library */ + + +/* u8g2: a monochrome graphic library */ + + +/* PainterEngine: A cross-platform graphics application framework written in C language */ + /* tools packages */ /* system packages */ +/* enhanced kernel services */ + + +/* acceleration: Assembly language or algorithmic acceleration packages */ + + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + + +/* Micrium: Micrium software products porting for RT-Thread */ + /* peripheral libraries and drivers */ +/* Kendryte SDK */ + + +/* AI packages */ + + /* miscellaneous packages */ +/* project laboratory */ /* samples: kernel and components samples */ + +/* entertainment: terminal games and other interesting software packages */ + #include "rtconfig_project.h" #endif diff --git a/include/rtdef.h b/include/rtdef.h index be702a0b26..f04c3300b6 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -208,11 +208,11 @@ typedef __gnuc_va_list va_list; /* The way that TI compiler set section is different from other(at least * GCC and MDK) compilers. See ARM Optimizing C/C++ Compiler 5.9.3 for more * details. */ -#define RT_SECTION(x) -#define RT_USED +#define RT_SECTION(x) __attribute__((section(x))) +#define RT_USED __attribute__((used)) #define PRAGMA(x) _Pragma(#x) -#define ALIGN(n) -#define RT_WEAK +#define ALIGN(n) __attribute__((aligned(n))) +#define RT_WEAK __attribute__((weak)) #define rt_inline static inline #define RTT_API #elif defined (__TASKING__) diff --git a/libcpu/ti-dsp/c28x/context.s b/libcpu/ti-dsp/c28x/context.s index 2b019e0714..297b3b2119 100644 --- a/libcpu/ti-dsp/c28x/context.s +++ b/libcpu/ti-dsp/c28x/context.s @@ -10,6 +10,7 @@ ; 2019-07-03 zhaoxiaowei add _rt_hw_calc_csb function to support __rt_ffs. ; 2019-12-05 xiaolifan add support for hardware fpu32 ; 2022-06-21 guyunjie trim pendsv (RTOSINT_Handler) +; 2022-08-24 guyunjie fix bugs in context switching .ref _rt_interrupt_to_thread .ref _rt_interrupt_from_thread @@ -39,7 +40,6 @@ RT_CTX_SAVE .macro - PUSH AR1H:AR0H PUSH XAR2 PUSH XAR3 @@ -90,7 +90,6 @@ RT_CTX_RESTORE .macro POP XAR3 POP XAR2 - MOVZ AR0 , @SP SUBB XAR0, #6 MOVL ACC , *XAR0 @@ -98,7 +97,6 @@ RT_CTX_RESTORE .macro MOV AL, IER MOVL *XAR0, ACC - POP AR1H:AR0H .endm @@ -130,23 +128,19 @@ _rt_hw_interrupt_enable: ; ; void rt_hw_context_switch(rt_uint32 from, rt_uint32 to); -; r0 --> from -; r4 --> to - - +; ACC --> from +; SP[4] --> to +; .asmfunc _rt_hw_context_switch_interrupt: - MOVL XAR0, #0 - MOV AR0, AL + MOVL XAR0, ACC MOVL XAR4, *-SP[4] ; set rt_thread_switch_interrupt_flag to 1 MOVL XAR5, #_rt_thread_switch_interrupt_flag - MOVL XAR6, *XAR5 - MOVL ACC, XAR6 - CMPB AL, #1 - B _reswitch, EQ - MOVL XAR6, #1 - MOVL *XAR5, XAR6 + MOVL ACC, *XAR5 + BF _reswitch, NEQ ; ACC!=0 + MOVB ACC, #1 + MOVL *XAR5, ACC MOVL XAR5, #_rt_interrupt_from_thread ; set rt_interrupt_from_thread MOVL *XAR5, XAR0 @@ -160,23 +154,19 @@ _reswitch: ; ; void rt_hw_context_switch(rt_uint32 from, rt_uint32 to); -; r0 --> from -; r4 --> to - - +; ACC --> from +; SP[4] --> to +; .asmfunc _rt_hw_context_switch: - MOVL XAR0, #0 - MOV AR0, AL + MOVL XAR0, ACC MOVL XAR4, *-SP[4] ; set rt_thread_switch_interrupt_flag to 1 MOVL XAR5, #_rt_thread_switch_interrupt_flag - MOVL XAR6, *XAR5 - MOVL ACC, XAR6 - CMPB AL, #1 - B _reswitch2, EQ - MOVL XAR6, #1 - MOVL *XAR5, XAR6 + MOVL ACC, *XAR5 + BF _reswitch2, NEQ ; ACC!=0 + MOVB ACC, #1 + MOVL *XAR5, ACC MOVL XAR5, #_rt_interrupt_from_thread ; set rt_interrupt_from_thread MOVL *XAR5, XAR0 @@ -189,63 +179,64 @@ _reswitch2: LRETR .endasmfunc - .asmfunc +; +; * void rt_hw_context_switch_to(rt_uint32 to); +; * ACC --> to +; + .asmfunc +_rt_hw_context_switch_to: + ; get to thread + MOVL XAR1, #_rt_interrupt_to_thread + MOVL *XAR1, ACC + + ; set from thread to 0 + MOVL XAR1, #_rt_interrupt_from_thread + MOVL XAR0, #0 + MOVL *XAR1, XAR0 + + ; set interrupt flag to 1 + MOVL XAR1, #_rt_thread_switch_interrupt_flag + MOVL XAR0, #1 + MOVL *XAR1, XAR0 + + TRAP #16 + + ; never reach here! + .endasmfunc + + .asmfunc _RTOSINT_Handler: ; disable interrupt to protect context switch ; DINT ;this is done by hardware so not needed ; get rt_thread_switch_interrupt_flag - MOV AR0, #_rt_thread_switch_interrupt_flag - MOV AL, *AR0 - MOV AR1, AL - CMP AR1, #0 - B rtosint_exit, EQ ; pendsv already handled + MOVL XAR0, #_rt_thread_switch_interrupt_flag + MOVL ACC, *XAR0 + BF rtosint_exit, EQ ; pendsv already handled ; clear rt_thread_switch_interrupt_flag to 0 - MOV AR1, #0x00 - MOV *AR0, AR1 - - MOV AR0, #_rt_interrupt_from_thread - MOV AL, *AR0 - MOV AR1, AL - CMP AR1, #0 - B switch_to_thread, EQ ; skip register save at the first time - -;#if defined (__VFP_FP__) && !defined(__SOFTFP__) -; TST lr, #0x10 ; if(!EXC_RETURN[4]) -; VSTMDBEQ r1!, {d8 - d15} ; push FPU register s16~s31 -;#endif + MOVL XAR1, #0 + MOVL *XAR0, XAR1 - RT_CTX_SAVE ; push r4 - r11 register + MOVL XAR0, #_rt_interrupt_from_thread + MOVL ACC, *XAR0 + BF switch_to_thread, EQ ; skip register save at the first time -;#if defined (__VFP_FP__) && !defined(__SOFTFP__) -; MOV r4, #0x00 ; flag = 0 + RT_CTX_SAVE ; push cpu registers -; TST lr, #0x10 ; if(!EXC_RETURN[4]) -; MOVEQ r4, #0x01 ; flag = 1 - -; STMFD r1!, {r4} ; push flag -;#endif - - MOV AL, *AR0 - MOV AR0, AL + MOVL ACC, *XAR0 + MOVL XAR0, ACC MOVZ AR1, @SP ; get from thread stack pointer - MOV *AR0, AR1 ; update from thread stack pointer + MOVL *XAR0, XAR1 ; update from thread stack pointer switch_to_thread: - MOV AR1, #_rt_interrupt_to_thread - MOV AL, *AR1 - MOV AR1, AL - MOV AL, *AR1 - MOV AR1, AL ; load thread stack pointer - -;#if defined (__VFP_FP__) && !defined(__SOFTFP__) -; LDMFD r1!, {r3} ; pop flag -;#endif + MOVL XAR1, #_rt_interrupt_to_thread + MOVL ACC, *XAR1 + MOVL XAR1, ACC + MOVL ACC, *XAR1 + MOV @SP, AL ; load thread stack pointer - MOV @SP, AR1 - - RT_CTX_RESTORE ; pop r4 - r11 register + RT_CTX_RESTORE ; pop cpu registers rtosint_exit: ; do not restore interrupt here: to be restored according to the @@ -287,38 +278,6 @@ _rt_hw_calc_csb: lretr .endasmfunc -; -; * void rt_hw_context_switch_to(rt_uint32 to); -; * r0 --> to - - .asmfunc -_rt_hw_context_switch_to: - MOV AR1, #_rt_interrupt_to_thread - MOV *AR1, AL - -;#if defined (__VFP_FP__) && !defined(__SOFTFP__) - ; CLEAR CONTROL.FPCA -; MRS r2, CONTROL ; read -; BIC r2, #0x04 ; modify -; MSR CONTROL, r2 ; write-back -;#endif - - ; set from thread to 0 - MOV AR1, #_rt_interrupt_from_thread - MOV AR0, #0x0 - MOV *AR1, AR0 - - ; set interrupt flag to 1 - MOV AR1, #_rt_thread_switch_interrupt_flag - MOV AR0, #1 - MOV *AR1, AR0 - - TRAP #16 - - - ; never reach here! - .endasmfunc - ; compatible with old version .asmfunc _rt_hw_interrupt_thread_switch: diff --git a/libcpu/ti-dsp/c28x/cpuport.c b/libcpu/ti-dsp/c28x/cpuport.c index 8903ea0a40..9ffd96d4f7 100644 --- a/libcpu/ti-dsp/c28x/cpuport.c +++ b/libcpu/ti-dsp/c28x/cpuport.c @@ -76,9 +76,8 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, unsigned long i; stk = stack_addr; - stk = (rt_uint8_t *)RT_ALIGN((rt_uint32_t)stk, 8); - //stk -= sizeof(struct stack_frame); - stk += 1; + stk = (rt_uint8_t *)RT_ALIGN((rt_uint32_t)stk, 2); + stk += 1; /*to work around the stack alignment*/ stack_frame = (struct stack_frame *)stk; diff --git a/src/components.c b/src/components.c index 37519c042a..78eb002214 100644 --- a/src/components.c +++ b/src/components.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -145,7 +145,6 @@ int $Sub$$main(void) return 0; } #elif defined(__ICCARM__) -extern int main(void); /* __low_level_init will auto called by IAR cstartup */ extern void __iar_data_init3(void); int __low_level_init(void) @@ -194,7 +193,7 @@ void main_thread_entry(void *parameter) extern int $Super$$main(void); $Super$$main(); /* for ARMCC. */ } -#elif defined(__ICCARM__) || defined(__GNUC__) || defined(__TASKING__) +#elif defined(__ICCARM__) || defined(__GNUC__) || defined(__TASKING__) || defined(__TI_COMPILER_VERSION__) main(); #endif } -- GitLab