I’ve finally fixed all 100500 issues and build RTOS application on C++. Here are diff files if anyone want to reproduce that.
--- /home/owner/Public/freertos/cvitek/scripts/toolchain-riscv64-elf.cmake
+++ /home/owner/Public/duo-buildroot-sdk-Duo-V1.0.9/freertos/cvitek/scripts/toolchain-riscv64-elf.cmake
@@ -57,3 +57,21 @@
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-missing-field-initializers" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-parentheses" )
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv64imafdc" )
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mabi=lp64d" )
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections" )
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections" )
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin" )
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdlib" )
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcmodel=medany" )
+
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DFREERTOS_BSP" )
+if ($ENV{DDR_64MB_SIZE} STREQUAL "y")
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLINUX_BSP_64MB" )
+else()
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLINUX_BSP_128MB" )
+endif()
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__riscv_xlen=64" )
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DTHEAD_C906" )
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCONFIG_64BIT" )
+set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRISCV_FPU" )
--- /home/owner/Public/freertos/cvitek/task/comm/CMakeLists.txt
+++ /home/owner/Public/duo-buildroot-sdk-Duo-V1.0.9/freertos/cvitek/task/comm/CMakeLists.txt
@@ -1,4 +1,5 @@
-file(GLOB _SOURCES "src/${RUN_ARCH}/*.c")
+#file(GLOB _SOURCES "src/${RUN_ARCH}/*.c")
+file(GLOB _SOURCES "src/${RUN_ARCH}/*.c" "src/${RUN_ARCH}/*.cpp")
include_directories(include)
include_directories(${CMAKE_INSTALL_INC_PREFIX}/arch)
--- /home/owner/Public/freertos/cvitek/task/main/CMakeLists.txt
+++ /home/owner/Public/duo-buildroot-sdk-Duo-V1.0.9/freertos/cvitek/task/main/CMakeLists.txt
@@ -1,4 +1,5 @@
-file(GLOB _SOURCES "src/*.c" "*.S")
+#file(GLOB _SOURCES "src/*.c" "*.S")
+file(GLOB _SOURCES "src/*.c" "src/*.cpp" "*.S")
# try to find out the include folder recursively under CMAKE_INSTALL_PREFIX folder
MACRO(HEADER_DIRECTORIES return_list)
--- /home/owner/Public/freertos/cvitek/task/CMakeLists.txt
+++ /home/owner/Public/duo-buildroot-sdk-Duo-V1.0.9/freertos/cvitek/task/CMakeLists.txt
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.16.5)
-project(arch C ASM)
+project(arch C CXX ASM)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -12,7 +12,7 @@
set(SAFETY_FLAGS "-Wall -Wextra -fno-strict-aliasing -static --specs=nosys.specs")
#set(SAFETY_FLAGS "-Werror -Wall -Wextra -fno-strict-aliasing")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SAFETY_FLAGS} -D${RUN_TYPE}")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SAFETY_FLAGS}")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SAFETY_FLAGS} -D${RUN_TYPE}")
include(${TOP_DIR}/scripts/ParseConfiguration.cmake)
ParseConfiguration("${BUILD_ENV_PATH}/.config")
--- /home/owner/Public/freertos/cvitek/task/main/src/main.c
+++ /home/owner/Public/duo-buildroot-sdk-Duo-V1.0.9/freertos/cvitek/task/main/src/main.cpp
@@ -100,10 +100,16 @@
/* Prototypes for the standard FreeRTOS callback/hook functions implemented
within this file. */
+extern "C"
+{
void vApplicationMallocFailedHook(void);
void vApplicationIdleHook(void);
void vApplicationStackOverflowHook(TaskHandle_t pxTask, char *pcTaskName);
void vApplicationTickHook(void);
+void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer,
+ StackType_t **ppxTimerTaskStackBuffer,
+ uint32_t *pulTimerTaskStackSize);
+}
/* configAPPLICATION_ALLOCATED_HEAP is set to 1 in FreeRTOSConfig.h so the
application can define the array used as the FreeRTOS heap. This is done so the
@@ -113,6 +119,12 @@
uint8_t ucHeap[ configTOTAL_HEAP_SIZE ] __attribute__ ( ( section( ".heap" ) ) );
#endif
/*-----------------------------------------------------------*/
+
+extern "C"
+{
+extern void pre_system_init();
+extern void post_system_init();
+}
int main(void)
{
--- /home/owner/Public/freertos/cvitek/task/comm/src/riscv64/comm_main.c
+++ /home/owner/Public/duo-buildroot-sdk-Duo-V1.0.9/freertos/cvitek/task/comm/src/riscv64/comm_main.cpp
@@ -9,6 +9,8 @@
#include "delay.h"
/* cvitek includes. */
+extern "C"
+{
#include "printf.h"
#include "rtos_cmdqu.h"
#include "cvi_mailbox.h"
@@ -16,10 +18,12 @@
#include "top_reg.h"
#include "memmap.h"
#include "comm.h"
+
#include "cvi_spinlock.h"
/* Milk-V Duo */
#include "milkv_duo_io.h"
+}
// #define __DEBUG__
#ifdef __DEBUG__
@@ -40,14 +44,14 @@
/****************************************************************************
* Function prototypes
****************************************************************************/
-void prvQueueISR(void);
+int prvQueueISR(int, void*);
void prvCmdQuRunTask(void *pvParameters);
-
/****************************************************************************
* Global parameters
****************************************************************************/
-TASK_CTX_S gTaskCtx[1] = {
+
+/*TASK_CTX_S gTaskCtx[1] = {
{
.name = "CMDQU",
.stack_size = configMINIMAL_STACK_SIZE,
@@ -56,7 +60,19 @@
.queLength = 30,
.queHandle = NULL,
},
+};*/
+
+TASK_CTX_S gTaskCtx[1] = {
+ {
+ "CMDQU",
+ configMINIMAL_STACK_SIZE,
+ tskIDLE_PRIORITY + 5,
+ prvCmdQuRunTask,
+ 30,
+ NULL,
+ },
};
+
/* mailbox parameters */
volatile struct mailbox_set_register *mbox_reg;
@@ -85,6 +101,7 @@
TASK_INIT(i);
}
}
+
void main_cvirtos(void)
{
@@ -221,14 +238,14 @@
drv_spin_unlock_irqrestore(&mailbox_lock, flags);
if (valid >= MAILBOX_MAX_NUM) {
printf("No valid mailbox is available\n");
- return -1;
+ return ;
}
break;
}
}
}
-void prvQueueISR(void)
+int prvQueueISR(int, void*)
{
printf("prvQueueISR\n");
unsigned char set_val;
@@ -278,4 +295,6 @@
}
}
}
-}
+
+ return 0;
+}