diff --git a/arch/arc/arcem/port.h b/arch/arc/arcem/port.h new file mode 100644 index 00000000..4cf98c0f --- /dev/null +++ b/arch/arc/arcem/port.h @@ -0,0 +1,74 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#ifndef _PORT_H_ +#define _PORT_H_ + +#if TOS_CFG_FAULT_BACKTRACE_EN > 0u + +#endif + +#if defined(TOS_CFG_CPU_LEAD_ZEROS_ASM_PRESENT) && (TOS_CFG_CPU_LEAD_ZEROS_ASM_PRESENT == 1u) +__PORT__ uint32_t port_cpu_clz(uint32_t); +#endif + +__PORT__ void port_int_disable(void); + +__PORT__ void port_int_enable(void); + +__PORT__ cpu_cpsr_t port_cpsr_save(void); + +__PORT__ void port_cpsr_restore(cpu_cpsr_t cpsr); + +__PORT__ void port_cpu_reset(void); + +__PORT__ void port_sched_start(void) __NO_RETURN__; + +__PORT__ void port_context_switch(void); + +__PORT__ void port_irq_context_switch(void); + +__PORT__ void port_systick_config(uint32_t cycle_per_tick); + +__PORT__ void port_systick_priority_set(uint32_t prio); + +#if TOS_CFG_TICKLESS_EN > 0u + +__PORT__ void port_systick_resume(void); + +__PORT__ void port_systick_suspend(void); + +__PORT__ void port_systick_reload(uint32_t cycle_per_tick); + +__PORT__ void port_systick_pending_reset(void); + +__PORT__ k_time_t port_systick_max_delay_millisecond(void); + +#endif + +#if TOS_CFG_PWR_MGR_EN > 0u + +__PORT__ void port_sleep_mode_enter(void); + +__PORT__ void port_stop_mode_enter(void); + +__PORT__ void port_standby_mode_enter(void); + +#endif + +#endif /* _PORT_H_ */ + diff --git a/arch/arc/arcem/port_c.c b/arch/arc/arcem/port_c.c new file mode 100644 index 00000000..36b16af3 --- /dev/null +++ b/arch/arc/arcem/port_c.c @@ -0,0 +1,103 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#include "tos_k.h" +#include "arc/arc_timer.h" +#include "board.h" +#include "arc/arc_exception.h" + +__PORT__ void port_cpu_reset(void) +{ + exc_entry_reset(); +} + +__PORT__ void port_systick_config(uint32_t cycle_per_tick) +{ + arc_timer_int_clear(0); + board_timer_update(cycle_per_tick); +} +__PORT__ void port_systick_priority_set(uint32_t prio) +{ + int_pri_set(BOARD_OS_TIMER_INTNO, prio); +} + + +#if TOS_CFG_TICKLESS_EN > 0u + +__PORT__ k_time_t port_systick_max_delay_millisecond(void) +{ + k_time_t max_millisecond; + uint32_t max_cycle; + + max_cycle = arc_aux_read(AUX_TIMER0_LIMIT); // AUX_TIMER0_CNT, reset value 0x00FFFFFF + max_millisecond = (k_time_t)((uint64_t)max_cycle * K_TIME_MILLISEC_PER_SEC / TOS_CFG_CPU_CLOCK); // CLOCK: cycle per second + return max_millisecond; +} + +__PORT__ void port_systick_resume(void) +{ + arc_aux_write(AUX_TIMER0_CTRL, TIMER_CTRL_IE); // enables the generation of an interrupt after the timer has reached its limit + arc_aux_write(AUX_TIMER0_CNT, 0); // writing to this register sets 0 for the timer, and restarts the timer +} + +__PORT__ void port_systick_suspend(void) +{ + arc_aux_write(AUX_TIMER0_CTRL, TIMER_CTRL_NH); // counting is suspended during host debugger interactions with the processor. +} + +__PORT__ void port_systick_reload(uint32_t cycle_per_tick) +{ + uint32_t max_cycle; + uint32_t systick_value; + + max_cycle = arc_aux_read(AUX_TIMER0_LIMIT); // AUX_TIMER0_CNT, reset value 0x00FFFFFF + systick_value = arc_aux_read(AUX_TIMER0_CNT); + + if (max_cycle - systick_value > cycle_per_tick - 1u) { + arc_aux_write(AUX_TIMER0_LIMIT, max_cycle); + } else { + arc_aux_write(AUX_TIMER0_LIMIT, (cycle_per_tick - 1u) + systick_value); + } + + arc_aux_write(AUX_TIMER0_CNT, 0); +} + +__PORT__ void port_systick_pending_reset(void) +{ + arc_aux_write(AUX_TIMER0_CTRL, TIMER_CTRL_IP); // interrupt pending +} + +#endif + +#if TOS_CFG_PWR_MGR_EN > 0u + +__PORT__ void port_sleep_mode_enter(void) +{ + Asm("sleep"); +} + +__PORT__ void port_stop_mode_enter(void) +{ + Asm("brk"); +} + +__PORT__ void port_standby_mode_enter(void) +{ + Asm("nop"); +} + +#endif diff --git a/arch/arc/arcem/port_config.h b/arch/arc/arcem/port_config.h new file mode 100644 index 00000000..b8760b37 --- /dev/null +++ b/arch/arc/arcem/port_config.h @@ -0,0 +1,28 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#ifndef _PORT_CONFIG_H_ +#define _PORT_CONFIG_H_ + +#define TOS_CFG_CPU_ADDR_SIZE CPU_WORD_SIZE_32 +#define TOS_CFG_CPU_DATA_SIZE CPU_WORD_SIZE_32 +#define TOS_CFG_CPU_STK_GROWTH CPU_STK_GROWTH_DESCENDING +#define TOS_CFG_CPU_HRTIMER_EN 0u +#define TOS_CFG_CPU_LEAD_ZEROS_ASM_PRESENT 1u +#define TOS_CFG_CPU_BYTE_ORDER 0u + +#endif /* _PORT_CONFIG_H_ */ diff --git a/arch/arc/arcem/port_s.s b/arch/arc/arcem/port_s.s new file mode 100644 index 00000000..4a7ff582 --- /dev/null +++ b/arch/arc/arcem/port_s.s @@ -0,0 +1,319 @@ +/* + * Copyright (c) 2020, Synopsys, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#define __ASSEMBLY__ +#include "arc.h" +#include "arc_asm_common.h" + +.global k_curr_task +.global k_next_task + +.global g_exc_nest_count +.global g_context_switch_reqflg + +.global tos_knl_irq_enter +.global tos_knl_irq_leave + + .text + .align 4 +dispatcher: + st sp, [r0] // ld r0, [k_curr_task] + ld sp, [r1] // ld r1, [k_next_task] +# k_curr_task = k_next_task; + st r1, [k_curr_task] + pop r0 + j [r0] + +/* return routine when task dispatch happened in task context */ +dispatch_r: + RESTORE_NONSCRATCH_REGS + j [blink] + + +/* + * void port_sched_start(void) + */ + .global port_sched_start + .align 4 +port_sched_start: + ld r0, [k_curr_task] + ld sp, [r0] + pop r0 + j [r0] + + +/* + * void port_context_switch(void) + */ + .global port_context_switch + .align 4 +port_context_switch: + SAVE_NONSCRATCH_REGS + mov r2, dispatch_r + push r2 + ld r0, [k_curr_task] + ld r1, [k_next_task] + b dispatcher + +/* + * void port_irq_context_switch(void) + */ + .global port_irq_context_switch + .align 4 +port_irq_context_switch: + mov r0, 1 + st r0, [g_context_switch_reqflg] + j [blink] + + +/* + * void start_r(void) + */ + .global start_r + .align 4 +start_r: + pop blink; + pop r1 + pop r2 + pop r0 + + kflag r2 + j [r1] + +/****** exceptions and interrupts handing ******/ +/****** entry for exception handling ******/ + .global exc_entry_cpu + .align 4 +exc_entry_cpu: + + EXCEPTION_PROLOGUE + + mov blink, sp + mov r3, sp /* as exception handler's para(p_excinfo) */ + + ld r0, [g_exc_nest_count] + add r1, r0, 1 + st r1, [g_exc_nest_count] + brne r0, 0, exc_handler_1 +/* change to exception stack if interrupt happened in task context */ + mov sp, _e_stack +exc_handler_1: + PUSH blink + + jl tos_knl_irq_enter + + lr r0, [AUX_ECR] + lsr r0, r0, 16 + mov r1, exc_int_handler_table + ld.as r2, [r1, r0] + + mov r0, r3 + jl [r2] + + jl tos_knl_irq_leave + +/* interrupts are not allowed */ +ret_exc: + POP sp + mov r1, g_exc_nest_count + ld r0, [r1] + sub r0, r0, 1 + st r0, [r1] + brne r0, 0, ret_exc_1 /* nest exception case */ + lr r1, [AUX_IRQ_ACT] /* nest interrupt case */ + brne r1, 0, ret_exc_1 + + ld r0, [g_context_switch_reqflg] + brne r0, 0, ret_exc_2 +ret_exc_1: /* return from non-task context, interrupts or exceptions are nested */ + EXCEPTION_EPILOGUE + rtie + +/* there is a dispatch request */ +ret_exc_2: + /* clear dispatch request */ + mov r0, 0 + st r0, [g_context_switch_reqflg] + + SAVE_CALLEE_REGS /* save callee save registers */ + + /* clear exception bit to do exception exit by SW */ + lr r0, [AUX_STATUS32] + bclr r0, r0, AUX_STATUS_BIT_AE + kflag r0 + + mov r1, ret_exc_r /* save return address */ + PUSH r1 + + ld r0, [k_curr_task] + ld r1, [k_next_task] + b dispatcher + +ret_exc_r: + /* recover exception status */ + lr r0, [AUX_STATUS32] + bset r0, r0, AUX_STATUS_BIT_AE + kflag r0 + + RESTORE_CALLEE_REGS + EXCEPTION_EPILOGUE + rtie + +/****** entry for normal interrupt exception handling ******/ + .global exc_entry_int /* entry for interrupt handling */ + .align 4 +exc_entry_int: +#if ARC_FEATURE_FIRQ == 1 +/* check whether it is P0 interrupt */ +#if ARC_FEATURE_RGF_NUM_BANKS > 1 + lr r0, [AUX_IRQ_ACT] + btst r0, 0 + jnz exc_entry_firq +#else + PUSH r10 + lr r10, [AUX_IRQ_ACT] + btst r10, 0 + POP r10 + jnz exc_entry_firq +#endif +#endif + INTERRUPT_PROLOGUE + + mov blink, sp + + clri /* disable interrupt */ + ld r3, [g_exc_nest_count] + add r2, r3, 1 + st r2, [g_exc_nest_count] + seti /* enable higher priority interrupt */ + + brne r3, 0, irq_handler_1 +/* change to exception stack if interrupt happened in task context */ + mov sp, _e_stack +#if ARC_FEATURE_STACK_CHECK +#if ARC_FEATURE_SEC_PRESENT + lr r0, [AUX_SEC_STAT] + bclr r0, r0, AUX_SEC_STAT_BIT_SSC + sflag r0 +#else + lr r0, [AUX_STATUS32] + bclr r0, r0, AUX_STATUS_BIT_SC + kflag r0 +#endif +#endif +irq_handler_1: + PUSH blink + + jl tos_knl_irq_enter + + lr r0, [AUX_IRQ_CAUSE] + sr r0, [AUX_IRQ_SELECT] + mov r1, exc_int_handler_table + ld.as r2, [r1, r0] /* r2 = exc_int_handler_table + irqno *4 */ +/* handle software triggered interrupt */ + lr r3, [AUX_IRQ_HINT] + cmp r3, r0 + bne.d irq_hint_handled + xor r3, r3, r3 + sr r3, [AUX_IRQ_HINT] +irq_hint_handled: + lr r3, [AUX_IRQ_PRIORITY] + PUSH r3 /* save irq priority */ + + jl [r2] /* jump to interrupt handler */ + + jl tos_knl_irq_leave + +ret_int: + clri /* disable interrupt */ + POP r3 /* irq priority */ + POP sp + mov r1, g_exc_nest_count + ld r0, [r1] + sub r0, r0, 1 + st r0, [r1] +/* if there are multi-bits set in IRQ_ACT, it's still in nest interrupt */ + lr r0, [AUX_IRQ_CAUSE] + sr r0, [AUX_IRQ_SELECT] + lr r3, [AUX_IRQ_PRIORITY] + lr r1, [AUX_IRQ_ACT] + bclr r2, r1, r3 + brne r2, 0, ret_int_1 + + ld r0, [g_context_switch_reqflg] + brne r0, 0, ret_int_2 +ret_int_1: /* return from non-task context */ + INTERRUPT_EPILOGUE + rtie +/* there is a dispatch request */ +ret_int_2: + /* clear dispatch request */ + mov r0, 0 + st r0, [g_context_switch_reqflg] + + /* interrupt return by SW */ + lr r10, [AUX_IRQ_ACT] + PUSH r10 + bclr r10, r10, r3 /* clear related bits in IRQ_ACT */ + sr r10, [AUX_IRQ_ACT] + + SAVE_CALLEE_REGS /* save callee save registers */ + mov r1, ret_int_r /* save return address */ + PUSH r1 + + ld r0, [k_curr_task] + ld r1, [k_next_task] + b dispatcher + +ret_int_r: + RESTORE_CALLEE_REGS + /* recover AUX_IRQ_ACT to restore the interrup status */ + POPAX AUX_IRQ_ACT + INTERRUPT_EPILOGUE + rtie + +/****** entry for fast irq exception handling ******/ + .global exc_entry_firq + .align 4 +exc_entry_firq: + SAVE_FIQ_EXC_REGS + + jl tos_knl_irq_enter + + lr r0, [AUX_IRQ_CAUSE] + mov r1, exc_int_handler_table +/* r2 = _kernel_exc_tbl + irqno *4 */ + ld.as r2, [r1, r0] + +/* for the case of software triggered interrupt */ + lr r3, [AUX_IRQ_HINT] + cmp r3, r0 + bne.d firq_hint_handled + xor r3, r3, r3 + sr r3, [AUX_IRQ_HINT] +firq_hint_handled: +/* jump to interrupt handler */ + mov r0, sp + jl [r2] + + jl tos_knl_irq_leave + +firq_return: + RESTORE_FIQ_EXC_REGS + rtie + +/* + * uint32_t port_cpu_clz(uint32_t val) + * r0 --> val + */ + .global port_cpu_clz + .align 4 +port_cpu_clz: + breq r0, 0, cpu_clz_return + fls r1, r0 + add r0, r1, 1 +cpu_clz_return: + j [blink] \ No newline at end of file diff --git a/arch/arc/common/include/tos_cpu.h b/arch/arc/common/include/tos_cpu.h new file mode 100644 index 00000000..dc6c1832 --- /dev/null +++ b/arch/arc/common/include/tos_cpu.h @@ -0,0 +1,133 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#ifndef _TOS_CPU_H_ +#define _TOS_CPU_H_ + +typedef struct cpu_context_st { + cpu_data_t pc; + cpu_data_t blink; + cpu_data_t task; + cpu_data_t status32; + cpu_data_t r0; +} cpu_context_t; + +__API__ uint32_t tos_cpu_clz(uint32_t val); + +__API__ void tos_cpu_int_disable(void); + +__API__ void tos_cpu_int_enable(void); + +__API__ cpu_cpsr_t tos_cpu_cpsr_save(void); + +__API__ void tos_cpu_cpsr_restore(cpu_cpsr_t cpsr); + +#if (TOS_CFG_CPU_HRTIMER_EN > 0u) + +__API__ void tos_cpu_hrtimer_init(void); + +__API__ cpu_hrtimer_t tos_cpu_hrtimer_read(void); + +#endif + + +__KNL__ void cpu_init(void); + + +__KNL__ void cpu_reset(void); + + +__KNL__ void cpu_systick_init(k_cycle_t cycle_per_tick); + + +__KNL__ void cpu_sched_start(void); + + +__KNL__ void cpu_context_switch(void); + + +__KNL__ void cpu_irq_context_switch(void); + +#if TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN > 0u + + +__KNL__ k_err_t cpu_task_stack_draught_depth(k_stack_t *stk_base, size_t stk_size, int *depth); + +#endif + + +__KNL__ k_stack_t *cpu_task_stk_init(void *entry, + void *arg, + void *exit, + k_stack_t *stk_base, + size_t stk_size); + +#if TOS_CFG_TICKLESS_EN > 0u + + +__KNL__ void cpu_systick_resume(void); + + +__KNL__ void cpu_systick_suspend(void); + + +__KNL__ void cpu_systick_reload_reset(void); + + +__KNL__ void cpu_systick_pending_reset(void); + + +__KNL__ k_time_t cpu_systick_max_delay_millisecond(void); + + +__KNL__ void cpu_systick_expires_set(k_time_t millisecond); + + +__KNL__ void cpu_systick_reset(void); + +#endif + +#if TOS_CFG_PWR_MGR_EN > 0u + + +__KNL__ void cpu_sleep_mode_enter(void); + + +__KNL__ void cpu_stop_mode_enter(void); + + +__KNL__ void cpu_standby_mode_enter(void); + +#endif + +/* Allocates CPU status register word. */ +#define TOS_CPU_CPSR_ALLOC() cpu_cpsr_t cpu_cpsr = (cpu_cpsr_t)0u + +/* Save CPU status word & disable interrupts.*/ +#define TOS_CPU_INT_DISABLE() \ + do { \ + cpu_cpsr = tos_cpu_cpsr_save(); \ + } while (0) + +/* Restore CPU status word. */ +#define TOS_CPU_INT_ENABLE() \ + do { \ + tos_cpu_cpsr_restore(cpu_cpsr); \ + } while (0) + +#endif /* _TOS_CPU_H_ */ + diff --git a/arch/arc/common/include/tos_cpu_def.h b/arch/arc/common/include/tos_cpu_def.h new file mode 100644 index 00000000..f71d7c8e --- /dev/null +++ b/arch/arc/common/include/tos_cpu_def.h @@ -0,0 +1,34 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#ifndef _TOS_CPU_DEF_H_ +#define _TOS_CPU_DEF_H_ + +enum CPU_WORD_SIZE { + CPU_WORD_SIZE_08, + CPU_WORD_SIZE_16, + CPU_WORD_SIZE_32, + CPU_WORD_SIZE_64, +}; + +enum CPU_STK_GROWTH { + CPU_STK_GROWTH_ASCENDING, + CPU_STK_GROWTH_DESCENDING, +}; + +#endif /* _TOS_CPU_DEF_H_ */ + diff --git a/arch/arc/common/include/tos_cpu_types.h b/arch/arc/common/include/tos_cpu_types.h new file mode 100644 index 00000000..62d9e014 --- /dev/null +++ b/arch/arc/common/include/tos_cpu_types.h @@ -0,0 +1,57 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#ifndef _TOS_CPU_TYPES_H_ +#define _TOS_CPU_TYPES_H_ + +/* CPU address type based on address bus size. */ +#if (TOS_CFG_CPU_ADDR_SIZE == CPU_WORD_SIZE_32) +typedef uint32_t cpu_addr_t; +#elif (TOS_CFG_CPU_ADDR_SIZE == CPU_WORD_SIZE_16) +typedef uint16_t cpu_addr_t; +#else +typedef uint8_t cpu_addr_t; +#endif + +/* CPU data type based on data bus size. */ +#if (TOS_CFG_CPU_DATA_SIZE == CPU_WORD_SIZE_32) +typedef uint32_t cpu_data_t; +#elif (TOS_CFG_CPU_DATA_SIZE == CPU_WORD_SIZE_16) +typedef uint16_t cpu_data_t; +#else +typedef uint8_t cpu_data_t; +#endif + +#if (TOS_CFG_CPU_HRTIMER_EN > 0) +#if (TOS_CFG_CPU_HRTIMER_SIZE == CPU_WORD_SIZE_08) +typedef uint8_t cpu_hrtimer_t; +#elif (TOS_CFG_CPU_HRTIMER_SIZE == CPU_WORD_SIZE_16) +typedef uint16_t cpu_hrtimer_t; +#elif (TOS_CFG_CPU_HRTIMER_SIZE == CPU_WORD_SIZE_64) +typedef uint64_t cpu_hrtimer_t; +#else +typedef uint32_t cpu_hrtimer_t; +#endif +#else +typedef uint32_t cpu_hrtimer_t; +#endif + +//typedef cpu_addr_t size_t; +typedef cpu_addr_t cpu_cpsr_t; + +#endif + diff --git a/arch/arc/common/include/tos_fault.h b/arch/arc/common/include/tos_fault.h new file mode 100644 index 00000000..55864657 --- /dev/null +++ b/arch/arc/common/include/tos_fault.h @@ -0,0 +1,28 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#ifndef _TOS_FAULT_H_ +#define _TOS_FAULT_H_ + +#if TOS_CFG_FAULT_BACKTRACE_EN > 0u + +#error "unsupport now" + +#endif + +#endif /* _TOS_FAULT_H_ */ + diff --git a/arch/arc/common/tos_cpu.c b/arch/arc/common/tos_cpu.c new file mode 100644 index 00000000..aab30a81 --- /dev/null +++ b/arch/arc/common/tos_cpu.c @@ -0,0 +1,266 @@ +/*---------------------------------------------------------------------------- + * Tencent is pleased to support the open source community by making TencentOS + * available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * If you have downloaded a copy of the TencentOS binary from Tencent, please + * note that the TencentOS binary is licensed under the BSD 3-Clause License. + * + * If you have downloaded a copy of the TencentOS source code from Tencent, + * please note that TencentOS source code is licensed under the BSD 3-Clause + * License, except for the third-party components listed below which are + * subject to different license terms. Your integration of TencentOS into your + * own projects may require compliance with the BSD 3-Clause License, as well + * as the other licenses applicable to the third-party components included + * within TencentOS. + *---------------------------------------------------------------------------*/ + +#include +#include "embARC.h" + +void tos_cpu_tick_handler(void) +{ + arc_timer_int_clear(BOARD_OS_TIMER_ID); + tos_tick_handler(); +} + +__API__ uint32_t tos_cpu_clz(uint32_t val) +{ +#if defined(TOS_CFG_CPU_LEAD_ZEROS_ASM_PRESENT) && (TOS_CFG_CPU_LEAD_ZEROS_ASM_PRESENT == 0u) + uint32_t nbr_lead_zeros = 0; + + if (!(val & 0XFFFF0000)) { + val <<= 16; + nbr_lead_zeros += 16; + } + + if (!(val & 0XFF000000)) { + val <<= 8; + nbr_lead_zeros += 8; + } + + if (!(val & 0XF0000000)) { + val <<= 4; + nbr_lead_zeros += 4; + } + + if (!(val & 0XC0000000)) { + val <<= 2; + nbr_lead_zeros += 2; + } + + if (!(val & 0X80000000)) { + nbr_lead_zeros += 1; + } + + if (!val) { + nbr_lead_zeros += 1; + } + + return (nbr_lead_zeros); +#else + return (32 - port_cpu_clz(val)); +#endif +} + +__API__ void tos_cpu_int_disable(void) +{ + arc_lock(); +} + +__API__ void tos_cpu_int_enable(void) +{ + arc_unlock(); +} + +__API__ cpu_cpsr_t tos_cpu_cpsr_save(void) +{ + return (cpu_cpsr_t)arc_lock_save(); +} + +__API__ void tos_cpu_cpsr_restore(cpu_cpsr_t cpsr) +{ + arc_unlock_restore(cpsr); +} + +__KNL__ void cpu_init(void) +{ + k_cpu_cycle_per_tick = TOS_CFG_CPU_CLOCK / k_cpu_tick_per_second; + cpu_systick_init(k_cpu_cycle_per_tick); + +#if (TOS_CFG_CPU_HRTIMER_EN > 0) + tos_cpu_hrtimer_init(); +#endif +} + +__KNL__ void cpu_reset(void) +{ + port_cpu_reset(); +} + +__KNL__ void cpu_sched_start(void) +{ + port_sched_start(); +} + +__KNL__ void cpu_context_switch(void) +{ + port_context_switch(); +} + +__KNL__ void cpu_irq_context_switch(void) +{ + port_irq_context_switch(); +} + +__KNL__ void cpu_systick_init(k_cycle_t cycle_per_tick) +{ + int_disable(BOARD_OS_TIMER_INTNO); /* disable os timer interrupt */ + arc_timer_stop(BOARD_OS_TIMER_ID); + arc_timer_start(BOARD_OS_TIMER_ID, TIMER_CTRL_IE | TIMER_CTRL_NH, cycle_per_tick); + + int_handler_install(BOARD_OS_TIMER_INTNO, (INT_HANDLER_T)tos_cpu_tick_handler); + int_pri_set(BOARD_OS_TIMER_INTNO, INT_PRI_MIN + 1); + int_enable(BOARD_OS_TIMER_INTNO); +} + +#if TOS_CFG_TICKLESS_EN > 0u + +/** + * @brief Set value to systick reload value register + * + * @param cycles The value set to register + * + * @return None + */ +__STATIC_INLINE__ void cpu_systick_reload(k_cycle_t cycle_per_tick) +{ + port_systick_reload(cycle_per_tick); +} + +/** + * @brief Enable systick interrupt + * + * @return None + */ +__KNL__ void cpu_systick_resume(void) +{ + port_systick_resume(); +} + +/** + * @brief Disable systick interrupt + * + * @return None + */ +__KNL__ void cpu_systick_suspend(void) +{ + port_systick_suspend(); +} + +__KNL__ k_time_t cpu_systick_max_delay_millisecond(void) +{ + return port_systick_max_delay_millisecond(); +} + +__KNL__ void cpu_systick_expires_set(k_time_t millisecond) +{ + k_cycle_t cycles; + + cycles = (k_cycle_t)((uint64_t)millisecond * TOS_CFG_CPU_CLOCK / K_TIME_MILLISEC_PER_SEC); /* CLOCK means cycle per second */ + + cpu_systick_reload(cycles - 12); /* interrupt delay */ +} + +__KNL__ void cpu_systick_pending_reset(void) +{ + port_systick_pending_reset(); +} + +__KNL__ void cpu_systick_reset(void) +{ + cpu_systick_reload(k_cpu_cycle_per_tick); +} + +#endif /* TOS_CFG_TICKLESS_EN */ + +#if TOS_CFG_PWR_MGR_EN > 0u + +__KNL__ void cpu_sleep_mode_enter(void) +{ + port_sleep_mode_enter(); +} + +__KNL__ void cpu_stop_mode_enter(void) +{ + port_stop_mode_enter(); +} + +__KNL__ void cpu_standby_mode_enter(void) +{ + port_standby_mode_enter(); +} + +#endif /* TOS_CFG_PWR_MGR_EN */ + +uint32_t g_context_switch_reqflg; +uint32_t g_exc_nest_count; +extern void start_r(void); + +#if ARC_FEATURE_STACK_CHECK +#define ARC_INIT_STATUS ((1 << AUX_STATUS_BIT_SC) | AUX_STATUS_MASK_IE | ((-1 - INT_PRI_MIN) << 1) | STATUS32_RESET_VALUE) +#else +#define ARC_INIT_STATUS (AUX_STATUS_MASK_IE | ((-1 - INT_PRI_MIN) << 1) | STATUS32_RESET_VALUE) +#endif + +__KNL__ k_stack_t *cpu_task_stk_init(void *entry, + void *arg, + void *exit, + k_stack_t *stk_base, + size_t stk_size) +{ + cpu_data_t *sp; + cpu_context_t *regs = 0; + + sp = (cpu_data_t *)&stk_base[stk_size]; + sp = (cpu_data_t *)((cpu_addr_t)sp & 0xFFFFFFFC); + sp -= (sizeof(cpu_context_t)/sizeof(cpu_data_t)); + regs = (cpu_context_t*) sp; + + regs->pc = (cpu_data_t)start_r; + regs->blink = (cpu_data_t)exit; + regs->task = (cpu_data_t)entry; + regs->status32 = ARC_INIT_STATUS; + regs->r0 = (cpu_data_t)arg; + + return (k_stack_t *)sp; +} + +#if TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN > 0u + +__KNL__ k_err_t cpu_task_stack_draught_depth(k_stack_t *stk_base, size_t stk_size, int *depth) +{ + uint8_t *slot; + uint8_t *sp, *bp; + int the_depth = 0; + + bp = (uint8_t *)&stk_base[0]; + + sp = &stk_base[stk_size]; + sp = (uint8_t *)((cpu_addr_t)sp & 0xFFFFFFF8); + + for (slot = sp - 1; slot >= bp; --slot) { + if (*slot != 0xCC) { + the_depth = sp - slot; + } + } + + *depth = the_depth; + if (the_depth == stk_size) { + return K_ERR_TASK_STK_OVERFLOW; + } + + return K_ERR_NONE; +} + +#endif diff --git a/arch/arc/common/tos_embarc.c b/arch/arc/common/tos_embarc.c new file mode 100644 index 00000000..95fa25ba --- /dev/null +++ b/arch/arc/common/tos_embarc.c @@ -0,0 +1,56 @@ +/* ------------------------------------------ + * Copyright (c) 2020, Synopsys, Inc. All rights reserved. + + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + + * 1) Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * 2) Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + + * 3) Neither the name of the Synopsys, Inc., nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + --------------------------------------------- */ + +#include +#include "cmsis_os.h" +#include "embARC.h" +#include "embARC_debug.h" + +#define APPLICATION_TASK_STK_SIZE 1024 +extern void application_entry(void *arg); +osThreadDef(application_entry, osPriorityNormal, 1, APPLICATION_TASK_STK_SIZE); + +EMBARC_WEAK void application_entry(void *arg) +{ + while (1) { + printf("This is a demo task,please use your task entry!\r\n"); + tos_task_delay(1000); + } +} + +int main(void) +{ + /* OS kernel initialization */ + osKernelInitialize(); + /* application initialization entry */ + osThreadCreate(osThread(application_entry), NULL); + /* start kernel */ + osKernelStart(); +} diff --git a/board/ARC_NSIM_EM/BSP/Inc/tos_config.h b/board/ARC_NSIM_EM/BSP/Inc/tos_config.h new file mode 100644 index 00000000..1c3eebe1 --- /dev/null +++ b/board/ARC_NSIM_EM/BSP/Inc/tos_config.h @@ -0,0 +1,47 @@ +#ifndef _TOS_CONFIG_H_ +#define _TOS_CONFIG_H_ + +#include "stddef.h" +#include "embARC.h" + +#define TOS_CFG_TASK_PRIO_MAX 10u + +#define TOS_CFG_ROUND_ROBIN_EN 1u + +#define TOS_CFG_OBJECT_VERIFY 0u + +#define TOS_CFG_EVENT_EN 1u + +#define TOS_CFG_MMHEAP_EN 1u + +#define TOS_CFG_MMHEAP_POOL_SIZE (1024*20) + +#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE (1024*20) + +#define TOS_CFG_MUTEX_EN 1u + +#define TOS_CFG_QUEUE_EN 1u + +#define TOS_CFG_TIMER_EN 1u + +#define TOS_CFG_SEM_EN 1u + +#define TOS_CFG_MMBLK_EN 1u + +#if (TOS_CFG_QUEUE_EN > 0u) +#define TOS_CFG_MSG_EN 1u +#else +#define TOS_CFG_MSG_EN 0u +#endif + +#define TOS_CFG_MSG_POOL_SIZE 10u + +#define TOS_CFG_IDLE_TASK_STK_SIZE 256u + +#define TOS_CFG_CPU_TICK_PER_SECOND 100u + +#define TOS_CFG_CPU_CLOCK BOARD_CPU_CLOCK + +#define TOS_CFG_TIMER_AS_PROC 1u + +#endif \ No newline at end of file diff --git a/board/ARC_NSIM_EM/hello_world/Makefile b/board/ARC_NSIM_EM/hello_world/Makefile new file mode 100644 index 00000000..c660adde --- /dev/null +++ b/board/ARC_NSIM_EM/hello_world/Makefile @@ -0,0 +1,277 @@ +# ------------------------------------------------ +# Generic Makefile for Synopsys Designware ARC processor +# ------------------------------------------------ + +###################################### +# target +###################################### +TARGET = TencentOS_tiny + +APPLICATION = hello_world + +###################################### +# building variables +###################################### +# debug build? +DEBUG = 1 +# optimization +OPT = -O0 + +# the root of TencentOS Tiny +TOP_DIR = ../../.. + +####################################### +# paths +####################################### +# Build path +BUILD_DIR = build + +####################################### +# embarc_bsp relative conifg +####################################### + +BOARD ?= nsim +BD_VER ?= 10 +CUR_CORE ?= arcem +TOOLCHAIN ?= mw +OLEVEL ?= O0 +OUT_DIR_ROOT ?= $(BUILD_DIR) + +export BOARD +export BD_VER +export CUR_CORE +export TOOLCHAIN +export OUT_DIR_ROOT +export OLEVEL + +EMBARC_BSP_ROOT = $(TOP_DIR)/platform/vendor_bsp/Synopsys/ARC/embarc_bsp + +EMBARC_BSP_TEST_FILE = $(EMBARC_BSP_ROOT)/arc/startup/arc_startup.s + +ifeq ($(wildcard $(EMBARC_BSP_TEST_FILE)),) +$(info ) +$(info ) +$(info ) +$(info ######################################################################################################) +$(info # #) +$(info # embarc_bsp not exist!!! #) +$(info # please git embarc_bsp from github #) +$(info # run the following cmd in folder /platform/vendor_bsp/Synopsys/ARC>: #) +$(info # git clone https://github.com/foss-for-synopsys-dwc-arc-processors/embarc_bsp.git -b upstream #) +$(info # #) +$(info ######################################################################################################) +$(info ) +$(info ) +$(info ) +$(error [Makefile.error]: embarc_bsp not exist!!!) +endif + +EMBARC_ROOT = $(EMBARC_BSP_ROOT) +export EMBARC_ROOT + +EMBARC_OUT_DIR = $(OUT_DIR_ROOT)/obj_$(BOARD)_$(BD_VER)/$(TOOLCHAIN)_$(CUR_CORE) + +ifeq ($(TOOLCHAIN),mw) +COMPILER_ARG_FILE := $(EMBARC_OUT_DIR)/embARC_generated/ccac.arg +LDF_FILE := $(EMBARC_OUT_DIR)/linker_mw.ldf +MDB_ARG_FILE := $(EMBARC_OUT_DIR)/embARC_generated/mdb.arg +else +COMPILER_ARG_FILE := $(EMBARC_OUT_DIR)/embARC_generated/gcc.arg +LDF_FILE := $(EMBARC_OUT_DIR)/linker_gnu.ldf +NSIM_PROPS := $(EMBARC_OUT_DIR)/embARC_generated/nsim.props +endif + +###################################### +# source +###################################### +# C sources +KERNEL_SRC = \ + ${wildcard $(TOP_DIR)/kernel/core/*.c} +C_SOURCES += $(KERNEL_SRC) + +ARCH_SRC = \ + ${wildcard $(TOP_DIR)/arch/arc/arcem/*.c} \ + ${wildcard $(TOP_DIR)/arch/arc/common/*.c} +C_SOURCES += $(ARCH_SRC) + +CMSIS_SRC = \ + ${wildcard $(TOP_DIR)/osal/cmsis_os/cmsis_os.c} +C_SOURCES += $(CMSIS_SRC) + +APPLICATION_SRC = \ + ${wildcard $(TOP_DIR)/board/ARC_NSIM_EM/BSP/Src/*.c} \ + ${wildcard $(TOP_DIR)/examples/$(APPLICATION)/*.c} + +C_SOURCES += $(APPLICATION_SRC) + +# ASM sources +ASM_SOURCES = \ + $(TOP_DIR)/arch/arc/arcem/port_s.s + +ifeq ($(TOOLCHAIN),mw) +PREFIX = +CC = $(PREFIX)ccac +AS = $(PREFIX)ccac + +SZ = $(PREFIX)sizeac + +OBJCOPY = $(PREFIX)elf2bin +ELF2HEX = $(PREFIX)elf2hex + +ELF2HEX_INOPT = -Q -I +ELF2HEX_OUTOPT = -o +ELF2BIN_OPT = +else +PREFIX = arc-elf32- +CC = $(PREFIX)gcc +AS = $(PREFIX)gcc -x assembler-with-cpp +SZ = $(PREFIX)size +OBJCOPY = $(PREFIX)objcopy +ELF2HEX = $(OBJCOPY) + +ELF2HEX_INOPT = -O ihex +ELF2HEX_OUTOPT = +ELF2BIN_OPT = -O binary -S +endif + +####################################### +# CFLAGS +####################################### + +# C defines + +NSIM_STACK_CHECK := -DARC_FEATURE_STACK_CHECK=0 +# 1: enable hardware stack check, 0 disable hardware stack check + +ifeq ($(TOOLCHAIN),mw) +TOOLCHAIN_DEF := -D__MW__ +else +TOOLCHAIN_DEF := -D__GNU__ -D_HAVE_LIBGLOSS_ +endif + +C_DEFS = \ + $(TOOLCHAIN_DEF) \ + $(NSIM_STACK_CHECK) \ + -DBOARD_NSIM \ + -DCURRENT_CORE=$(CUR_CORE) \ + -DEMBARC_TCF_GENERATED \ + -DHW_VERSION=$(BD_VER) \ + -DLIB_CONSOLE \ + -DLIB_CLIB \ + -D_HEAPSIZE=8192 \ + -D_HOSTLINK_ \ + -D_NSIM_ \ + -D_STACKSIZE=2048 \ + -DARC_FEATURE_STACK_CHECK=0 + +# include dirs +ARCH_INC = \ + -I $(TOP_DIR)/arch/arc/arcem \ + -I $(TOP_DIR)/arch/arc/common/include +C_INCLUDES += $(ARCH_INC) + +BOARD_INC = \ + -I $(TOP_DIR)/board/ARC_NSIM_EM/BSP/Inc +C_INCLUDES += $(BOARD_INC) + +KERNEL_INC = \ + -I $(TOP_DIR)/kernel/core/include \ + -I $(TOP_DIR)/kernel/pm/include \ + -I $(TOP_DIR)/kernel/hal/include +C_INCLUDES += $(KERNEL_INC) + +CMSIS_INC = \ + -I $(TOP_DIR)/osal/cmsis_os +C_INCLUDES += $(CMSIS_INC) + +EMBARC_BSP_INC = \ + -I $(EMBARC_BSP_ROOT)/board \ + -I $(EMBARC_BSP_ROOT)/board/nsim/configs/10 \ + -I $(EMBARC_BSP_ROOT)/include \ + -I $(EMBARC_BSP_ROOT)/include/arc \ + -I $(EMBARC_BSP_ROOT)/include/device/designware \ + -I $(EMBARC_BSP_ROOT)/include/device/subsystem \ + -I $(EMBARC_BSP_ROOT)/library \ + -I $(EMBARC_OUT_DIR)/embARC_generated +C_INCLUDES += $(EMBARC_BSP_INC) + +ifeq ($(TOOLCHAIN),mw) +ASFLAGS = @$(COMPILER_ARG_FILE) -Hnoccm -Hnosdata -Wincompatible-pointer-types -Hnocopyr -Hasmcpp -$(OLEVEL) -g $(C_DEFS) $(C_INCLUDES) -MMD -MT $@ -MF $@.d + +CFLAGS = @$(COMPILER_ARG_FILE) -Hnoccm -Hnosdata -Wincompatible-pointer-types -Hnocopyr -Hnocplus -$(OLEVEL) -g $(C_DEFS) $(C_INCLUDES) -MMD -MT $@ -MF $@.d + +LDFLAGS = -Hhostlink @$(COMPILER_ARG_FILE) -Hnocopyr -Hnosdata -Hnocrt -Hldopt=-Coutput=$(BUILD_DIR)/mw_arcem.map -Hldopt=-Csections -Hldopt=-Ccrossfunc -Hldopt=-Csize -zstdout $(LDF_FILE) +else + +ASFLAGS = @$(COMPILER_ARG_FILE) -fdata-sections -ffunction-sections -mno-sdata -$(OLEVEL) -g $(C_DEFS) $(C_INCLUDES) -x assembler-with-cpp + +CFLAGS = @$(COMPILER_ARG_FILE) -fdata-sections -ffunction-sections -mno-sdata -$(OLEVEL) -g $(C_DEFS) $(C_INCLUDES) -std=gnu99 + +LDFLAGS = --specs=nsim.specs @$(COMPILER_ARG_FILE) -mno-sdata -nostartfiles -Wl,-M,-Map=$(BUILD_DIR)/gnu_arcem.map -lm -Wl,--script=$(LDF_FILE) +endif +# default action: build all +all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin + + +####################################### +# build the application +####################################### +# list of objects +OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) +vpath %.c $(sort $(dir $(C_SOURCES))) +# list of ASM program objects +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) +vpath %.s $(sort $(dir $(ASM_SOURCES))) +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES_S:.S=.o))) +vpath %.S $(sort $(dir $(ASM_SOURCES_S))) + +# EMBARC_PREBUILT_LIBRARY = -Hldopt=-Bgrouplib +EMBARC_PREBUILT_LIBRARY = $(EMBARC_OUT_DIR)/libembarc.a + + +build_embarc_lib: | $(BUILD_DIR) + make -f $(EMBARC_BSP_ROOT)/options/options.mk V=1 embarc_lib + +$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) + $(CC) -c $(CFLAGS) $< -o $@ + +$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) + $(AS) -c $(ASFLAGS) $< -o $@ + +$(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR) + $(AS) -c $(ASFLAGS) $< -o $@ + +$(BUILD_DIR)/$(TARGET).elf: build_embarc_lib $(OBJECTS) Makefile + $(CC) $(LDFLAGS) $(OBJECTS) $(EMBARC_PREBUILT_LIBRARY) -o $@ + $(SZ) $@ + +$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(ELF2HEX) $(ELF2HEX_INOPT) $< $(ELF2HEX_OUTOPT) $@ + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(OBJCOPY) $(ELF2BIN_OPT) $< $@ + +$(BUILD_DIR): + mkdir $@ + +####################################### +# clean up +####################################### +clean: + -rm -fR $(BUILD_DIR) + +nsim_debug : $(BUILD_DIR)/$(TARGET).elf + mdb -nooptions -nogoifmain -toggle=include_local_symbols=1 -nsim -off=binary_stdin -off=binary_stdout -on=load_at_paddr -on=reset_upon_restart -off=flush_pipe -off=cr_for_more -OKN @$(MDB_ARG_FILE) $< +####################################### +# dependencies +####################################### +run : $(BUILD_DIR)/$(TARGET).elf +ifeq ($(TOOLCHAIN),mw) + mdb -nooptions -nogoifmain -toggle=include_local_symbols=1 -nsim -off=binary_stdin -off=binary_stdout -on=load_at_paddr -on=reset_upon_restart -off=flush_pipe -off=cr_for_more -OKN @$(MDB_ARG_FILE) -run $< +else + nsimdrv -p nsim_emt=1 -propsfile $(NSIM_PROPS) $< +endif + +-include $(wildcard $(BUILD_DIR)/*.d) + +# *** EOF *** \ No newline at end of file diff --git a/examples/hello_world/hello_world.c b/examples/hello_world/hello_world.c index 1d3b0380..72445b2d 100644 --- a/examples/hello_world/hello_world.c +++ b/examples/hello_world/hello_world.c @@ -1,10 +1,10 @@ #include "cmsis_os.h" -#define TASK1_STK_SIZE 512 +#define TASK1_STK_SIZE 1024 void task1(void *arg); osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE); -#define TASK2_STK_SIZE 512 +#define TASK2_STK_SIZE 1024 void task2(void *arg); osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE); @@ -65,6 +65,7 @@ void task3(void *arg) void application_entry(void *arg) { + printf("***I am task\r\n"); osThreadCreate(osThread(task1), NULL); // Create task1 osThreadCreate(osThread(task2), NULL); // Create task2 } diff --git a/osal/cmsis_os/cmsis_os2.c b/osal/cmsis_os/cmsis_os2.c index 37aa6699..ebe7826a 100644 --- a/osal/cmsis_os/cmsis_os2.c +++ b/osal/cmsis_os/cmsis_os2.c @@ -588,18 +588,18 @@ uint32_t osEventFlagsWait(osEventFlagsId_t ef_id, } else { k_event_flag_t flag_match; k_opt_t opt_pend = 0; - k_tick_t timeout = - (timeout == 0 || timeout == osWaitForever) ? TOS_TIME_FOREVER : timeout; - if (options & 0x01 == 0) { + timeout = + ((timeout == 0) || (timeout == osWaitForever)) ? TOS_TIME_FOREVER : timeout; + if (options & (0x01 == 0)) { opt_pend |= TOS_OPT_EVENT_PEND_ANY; } else { opt_pend |= TOS_OPT_EVENT_PEND_ALL; } - if (options & 0x02 == 0) { + if (options & (0x02 == 0)) { opt_pend |= TOS_OPT_EVENT_PEND_CLR; } - err = tos_event_pend(eventId, (k_event_flag_t)flags, &flag_match, timeout, + err = tos_event_pend(eventId, (k_event_flag_t)flags, &flag_match, (k_tick_t)timeout, opt_pend); rflags = err == K_ERR_NONE ? (uint32_t)flag_match : (uint32_t)errno_knl2cmsis(err); diff --git a/platform/vendor_bsp/Synopsys/ARC/embarc_bsp b/platform/vendor_bsp/Synopsys/ARC/embarc_bsp new file mode 160000 index 00000000..74ca775f --- /dev/null +++ b/platform/vendor_bsp/Synopsys/ARC/embarc_bsp @@ -0,0 +1 @@ +Subproject commit 74ca775f15d9740847a2a86381175daece0317be