support avr architecture based on ATMega32
1. IAR project, see TencentOS-tiny\board\ATMega32\IAR, both 4.12 and 7.20 is supplied.
This commit is contained in:
157
arch/avr/ATMega32/iccavr/port_s.asm
Normal file
157
arch/avr/ATMega32/iccavr/port_s.asm
Normal file
@@ -0,0 +1,157 @@
|
||||
#include <iom32.h>
|
||||
|
||||
RSEG CODE
|
||||
|
||||
EXTERN k_curr_task
|
||||
EXTERN k_next_task
|
||||
|
||||
PUBLIC port_int_disable
|
||||
PUBLIC port_int_enable
|
||||
PUBLIC port_cpsr_save
|
||||
PUBLIC port_cpsr_restore
|
||||
PUBLIC port_sched_start
|
||||
PUBLIC port_irq_context_switch
|
||||
PUBLIC port_context_switch
|
||||
|
||||
port_int_disable:
|
||||
CLI
|
||||
RET
|
||||
|
||||
|
||||
port_int_enable:
|
||||
SEI
|
||||
RET
|
||||
|
||||
|
||||
port_cpsr_save:
|
||||
IN R16, SREG
|
||||
CLI
|
||||
RET
|
||||
|
||||
|
||||
port_cpsr_restore:
|
||||
OUT SREG, R16
|
||||
RET
|
||||
|
||||
|
||||
port_sched_start:
|
||||
JMP _context_restore
|
||||
|
||||
|
||||
port_irq_context_switch:
|
||||
port_context_switch:
|
||||
_context_save:
|
||||
PUSH R0
|
||||
|
||||
/* save SREG */
|
||||
IN R0, SREG
|
||||
CLI
|
||||
PUSH R0
|
||||
|
||||
PUSH R1
|
||||
PUSH R2
|
||||
PUSH R3
|
||||
PUSH R4
|
||||
PUSH R5
|
||||
PUSH R6
|
||||
PUSH R7
|
||||
PUSH R8
|
||||
PUSH R9
|
||||
PUSH R10
|
||||
PUSH R11
|
||||
PUSH R12
|
||||
PUSH R13
|
||||
PUSH R14
|
||||
PUSH R15
|
||||
PUSH R16
|
||||
PUSH R17
|
||||
PUSH R18
|
||||
PUSH R19
|
||||
PUSH R20
|
||||
PUSH R21
|
||||
PUSH R22
|
||||
PUSH R23
|
||||
PUSH R24
|
||||
PUSH R25
|
||||
PUSH R26
|
||||
PUSH R27
|
||||
PUSH R28
|
||||
PUSH R29
|
||||
PUSH R30
|
||||
PUSH R31
|
||||
|
||||
/* k_curr_task->sp = SP */
|
||||
LDS R30, k_curr_task
|
||||
LDS R31, k_curr_task + 1
|
||||
|
||||
IN R0, SPL
|
||||
IN R1, SPH
|
||||
|
||||
ST Z, R0
|
||||
STD Z + 1, R1
|
||||
|
||||
_context_restore:
|
||||
/* k_curr_task = k_next_task */
|
||||
LDI R28, low(k_curr_task)
|
||||
LDI R29, high(k_curr_task)
|
||||
|
||||
LDI R30, low(k_next_task)
|
||||
LDI R31, high(k_next_task)
|
||||
|
||||
LD R0, Z
|
||||
LDD R1, Z + 1
|
||||
|
||||
ST Y, R0
|
||||
STD Y + 1, R1
|
||||
|
||||
/* SP = k_next_task->sp */
|
||||
LDS R30, k_next_task
|
||||
LDS R31, k_next_task + 1
|
||||
|
||||
LD R0, Z
|
||||
LDD R1, Z + 1
|
||||
|
||||
OUT SPL, R0
|
||||
OUT SPH, R1
|
||||
|
||||
/* do restore */
|
||||
POP R31
|
||||
POP R30
|
||||
POP R29
|
||||
POP R28
|
||||
POP R27
|
||||
POP R26
|
||||
POP R25
|
||||
POP R24
|
||||
POP R23
|
||||
POP R22
|
||||
POP R21
|
||||
POP R20
|
||||
POP R19
|
||||
POP R18
|
||||
POP R17
|
||||
POP R16
|
||||
POP R15
|
||||
POP R14
|
||||
POP R13
|
||||
POP R12
|
||||
POP R11
|
||||
POP R10
|
||||
POP R9
|
||||
POP R8
|
||||
POP R7
|
||||
POP R6
|
||||
POP R5
|
||||
POP R4
|
||||
POP R3
|
||||
POP R2
|
||||
POP R1
|
||||
|
||||
POP R0
|
||||
OUT SREG, R0
|
||||
POP R0
|
||||
|
||||
RET
|
||||
|
||||
END
|
||||
|
155
arch/avr/common/include/tos_cpu.h
Normal file
155
arch/avr/common/include/tos_cpu.h
Normal file
@@ -0,0 +1,155 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* 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 R31;
|
||||
cpu_data_t R30;
|
||||
cpu_data_t R29;
|
||||
cpu_data_t R28;
|
||||
cpu_data_t R27;
|
||||
cpu_data_t R26;
|
||||
cpu_data_t R25;
|
||||
cpu_data_t R24;
|
||||
cpu_data_t R23;
|
||||
cpu_data_t R22;
|
||||
cpu_data_t R21;
|
||||
cpu_data_t R20;
|
||||
cpu_data_t R19;
|
||||
cpu_data_t R18;
|
||||
cpu_data_t R17;
|
||||
cpu_data_t R16;
|
||||
cpu_data_t R15;
|
||||
cpu_data_t R14;
|
||||
cpu_data_t R13;
|
||||
cpu_data_t R12;
|
||||
cpu_data_t R11;
|
||||
cpu_data_t R10;
|
||||
cpu_data_t R9;
|
||||
cpu_data_t R8;
|
||||
cpu_data_t R7;
|
||||
cpu_data_t R6;
|
||||
cpu_data_t R5;
|
||||
cpu_data_t R4;
|
||||
cpu_data_t R3;
|
||||
cpu_data_t R2;
|
||||
cpu_data_t R1;
|
||||
|
||||
cpu_data_t SREG;
|
||||
cpu_data_t R0;
|
||||
|
||||
cpu_data_t PCH;
|
||||
cpu_data_t PCL;
|
||||
cpu_data_t LRH;
|
||||
cpu_data_t LRL;
|
||||
} 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
|
||||
|
||||
#if TOS_CFG_FAULT_BACKTRACE_EN > 0u
|
||||
|
||||
__KNL__ void cpu_fault_diagnosis(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_ */
|
||||
|
30
arch/avr/common/include/tos_cpu_def.h
Normal file
30
arch/avr/common/include/tos_cpu_def.h
Normal file
@@ -0,0 +1,30 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* 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_
|
||||
|
||||
#define CPU_WORD_SIZE_08 1
|
||||
#define CPU_WORD_SIZE_16 2
|
||||
#define CPU_WORD_SIZE_32 3
|
||||
#define CPU_WORD_SIZE_64 4
|
||||
|
||||
#define CPU_STK_GROWTH_ASCENDING 1
|
||||
#define CPU_STK_GROWTH_DESCENDING 2
|
||||
|
||||
#endif /* _TOS_CPU_DEF_H_ */
|
||||
|
56
arch/avr/common/include/tos_cpu_types.h
Normal file
56
arch/avr/common/include/tos_cpu_types.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* 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 cpu_cpsr_t;
|
||||
|
||||
#endif
|
||||
|
206
arch/avr/common/include/tos_fault.h
Normal file
206
arch/avr/common/include/tos_fault.h
Normal file
@@ -0,0 +1,206 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* 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
|
||||
|
||||
typedef int (*k_fault_log_writer_t)(const char *format, ...);
|
||||
|
||||
#define K_FAULT_STACK_DUMP_DEPTH 10u
|
||||
|
||||
#define K_FAULT_CALL_STACK_BACKTRACE_DEPTH 5u
|
||||
|
||||
typedef struct fault_cpu_frame_st {
|
||||
cpu_data_t r0;
|
||||
cpu_data_t r1;
|
||||
cpu_data_t r2;
|
||||
cpu_data_t r3;
|
||||
cpu_data_t r12;
|
||||
cpu_data_t lr;
|
||||
cpu_data_t pc;
|
||||
cpu_data_t spsr;
|
||||
} fault_cpu_frame_t;
|
||||
|
||||
typedef struct fault_exc_frame_st {
|
||||
fault_cpu_frame_t cpu_frame;
|
||||
} fault_exc_frame_t;
|
||||
|
||||
/**
|
||||
* information we need to do fault backtrace
|
||||
*/
|
||||
typedef struct fault_information_st {
|
||||
int is_thumb : 1; /**< whether it is thumb we use when we fall into fault? */
|
||||
int is_on_task : 1; /**< whether we are on a task when fall into fault? */
|
||||
int is_stk_ovrf : 1; /**< whether we get a stack overflow */
|
||||
|
||||
cpu_addr_t pc; /**< just where fault happens */
|
||||
|
||||
cpu_addr_t sp_before_fault; /**< original sp just before the cpu push the fault exception frame */
|
||||
|
||||
/**
|
||||
* we need main_stack_start & main_stack_limit to do call stack backtrace
|
||||
* when we fall into fault during a task, we should do the call stack backtrace on the task's stack
|
||||
* but if not, which means we are in kernel, we should do the call stack backtrace on the main stack
|
||||
* in arm v7-m, this should be the MSP's start and limit
|
||||
* in arm v7-a, call stack backtrace is another story(much more elegant because we have FP).
|
||||
*/
|
||||
cpu_addr_t stack_start; /**< current sp start address we use. if on task, it'll be the task's stack, otherwise it'll be the msp */
|
||||
cpu_addr_t stack_limit; /**< current sp limit address */
|
||||
cpu_addr_t code_start; /**< current code start address */
|
||||
cpu_addr_t code_limit; /**< current code limit address */
|
||||
} fault_info_t;
|
||||
|
||||
#if defined(__CC_ARM) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
|
||||
|
||||
#define DEFAULT_CODE_SECTION_NAME ER_IROM1
|
||||
#define DEFAULT_CSTACK_SECTION_NAME STACK
|
||||
|
||||
#define SECTION_START(_name_) _name_##$$Base
|
||||
#define SECTION_END(_name_) _name_##$$Limit
|
||||
#define IMAGE_SECTION_START(_name_) Image$$##_name_##$$Base
|
||||
#define IMAGE_SECTION_END(_name_) Image$$##_name_##$$Limit
|
||||
#define CSTACK_BLOCK_START(_name_) SECTION_START(_name_)
|
||||
#define CSTACK_BLOCK_END(_name_) SECTION_END(_name_)
|
||||
#define CODE_SECTION_START(_name_) IMAGE_SECTION_START(_name_)
|
||||
#define CODE_SECTION_END(_name_) IMAGE_SECTION_END(_name_)
|
||||
|
||||
extern const int CSTACK_BLOCK_START(DEFAULT_CSTACK_SECTION_NAME);
|
||||
extern const int CSTACK_BLOCK_END(DEFAULT_CSTACK_SECTION_NAME);
|
||||
extern const int CODE_SECTION_START(DEFAULT_CODE_SECTION_NAME);
|
||||
extern const int CODE_SECTION_END(DEFAULT_CODE_SECTION_NAME);
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_code_start(void)
|
||||
{
|
||||
return (cpu_addr_t)&CODE_SECTION_START(DEFAULT_CODE_SECTION_NAME);
|
||||
}
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_code_limit(void)
|
||||
{
|
||||
return (cpu_addr_t)&CODE_SECTION_END(DEFAULT_CODE_SECTION_NAME);
|
||||
}
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_msp_start(void)
|
||||
{
|
||||
return (cpu_addr_t)&CSTACK_BLOCK_START(DEFAULT_CSTACK_SECTION_NAME);
|
||||
}
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_msp_limit(void)
|
||||
{
|
||||
return (cpu_addr_t)&CSTACK_BLOCK_END(DEFAULT_CSTACK_SECTION_NAME);
|
||||
}
|
||||
|
||||
#elif defined(__ICCARM__)
|
||||
|
||||
#define DEFAULT_CODE_SECTION_NAME ".text"
|
||||
#define DEFAULT_CSTACK_SECTION_NAME "CSTACK"
|
||||
|
||||
#pragma section=DEFAULT_CSTACK_SECTION_NAME
|
||||
#pragma section=DEFAULT_CODE_SECTION_NAME
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_code_start(void)
|
||||
{
|
||||
return (cpu_addr_t)__section_begin(DEFAULT_CODE_SECTION_NAME);
|
||||
}
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_code_limit(void)
|
||||
{
|
||||
return (cpu_addr_t)__section_end(DEFAULT_CODE_SECTION_NAME);
|
||||
}
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_msp_start(void)
|
||||
{
|
||||
return (cpu_addr_t)__section_begin(DEFAULT_CSTACK_SECTION_NAME);
|
||||
}
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_msp_limit(void)
|
||||
{
|
||||
return (cpu_addr_t)__section_end(DEFAULT_CSTACK_SECTION_NAME);
|
||||
}
|
||||
|
||||
#elif defined(__GNUC__)
|
||||
|
||||
/**
|
||||
* if we are using keil(armcc) or mdk(iccarm), we probably use the defult link script supplied by the IDE.
|
||||
* the way to locate the text/stack section start and limit is to find them in default link script.
|
||||
* but if we build our project by makefile(or something like scons, cmake, etc), we probably need to write
|
||||
* our own link scrpit, if so, we should do like this(just a demo):
|
||||
*
|
||||
_stext = .;
|
||||
.text : {
|
||||
*(.text.startup)
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
}
|
||||
_etext = .;
|
||||
|
||||
__bss_start = .;
|
||||
.bss : {
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
*(COMMON)
|
||||
_sstack = .;
|
||||
*(.cstack)
|
||||
_estack = .;
|
||||
}
|
||||
__bss_end = .;
|
||||
* by this, we can locate text/stack section start and limit by _stext/_etext and _sstack/_estack
|
||||
*/
|
||||
#define DEFAULT_CODE_SECTION_START _stext
|
||||
#define DEFAULT_CODE_SECTION_END _etext
|
||||
#define DEFAULT_CSTACK_SECTION_START _sstack
|
||||
#define DEFAULT_CSTACK_SECTION_END _estack
|
||||
|
||||
extern const int DEFAULT_CODE_SECTION_START;
|
||||
extern const int DEFAULT_CODE_SECTION_END;
|
||||
|
||||
extern const int DEFAULT_CSTACK_SECTION_START;
|
||||
extern const int DEFAULT_CSTACK_SECTION_END;
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_code_start(void)
|
||||
{
|
||||
return (cpu_addr_t)(&(DEFAULT_CODE_SECTION_START));
|
||||
}
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_code_limit(void)
|
||||
{
|
||||
return (cpu_addr_t)(&(DEFAULT_CODE_SECTION_END));
|
||||
}
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_msp_start(void)
|
||||
{
|
||||
return (cpu_addr_t)(&(DEFAULT_CSTACK_SECTION_START));
|
||||
}
|
||||
|
||||
__STATIC_INLINE__ cpu_addr_t fault_msp_limit(void)
|
||||
{
|
||||
return (cpu_addr_t)(&(DEFAULT_CSTACK_SECTION_END));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
__API__ void tos_fault_log_writer_set(k_fault_log_writer_t log_writer);
|
||||
|
||||
__KNL__ int fault_default_log_writer(const char *format, ...);
|
||||
|
||||
__KNL__ void fault_backtrace(cpu_addr_t lr, fault_exc_frame_t *frame);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _TOS_FAULT_H_ */
|
||||
|
306
arch/avr/common/tos_cpu.c
Normal file
306
arch/avr/common/tos_cpu.c
Normal file
@@ -0,0 +1,306 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* 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"
|
||||
|
||||
__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 port_clz(val);
|
||||
#endif
|
||||
}
|
||||
|
||||
__API__ void tos_cpu_int_disable(void)
|
||||
{
|
||||
port_int_disable();
|
||||
}
|
||||
|
||||
__API__ void tos_cpu_int_enable(void)
|
||||
{
|
||||
port_int_enable();
|
||||
}
|
||||
|
||||
__API__ cpu_cpsr_t tos_cpu_cpsr_save(void)
|
||||
{
|
||||
return port_cpsr_save();
|
||||
}
|
||||
|
||||
__API__ void tos_cpu_cpsr_restore(cpu_cpsr_t cpsr)
|
||||
{
|
||||
port_cpsr_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)
|
||||
{
|
||||
#if 0
|
||||
port_systick_priority_set(TOS_CFG_CPU_SYSTICK_PRIO);
|
||||
port_systick_config(cycle_per_tick);
|
||||
#endif
|
||||
}
|
||||
|
||||
#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 */
|
||||
|
||||
__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;
|
||||
|
||||
sp = (cpu_data_t *)&stk_base[stk_size];
|
||||
|
||||
#if TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN > 0u
|
||||
uint8_t *slot = (uint8_t *)&stk_base[0];
|
||||
for (; slot < (uint8_t *)sp; ++slot) {
|
||||
*slot = 0xCC;
|
||||
}
|
||||
#endif
|
||||
|
||||
*--sp = (cpu_data_t)((uint16_t)exit & 0xFF); /* LRL */
|
||||
*--sp = (cpu_data_t)(((uint16_t)exit >> 8) & 0xFF); /* LRH */
|
||||
|
||||
*--sp = (cpu_data_t)((uint16_t)entry & 0xFF); /* PCL */
|
||||
*--sp = (cpu_data_t)(((uint16_t)entry >> 8) & 0xFF); /* PCH */
|
||||
|
||||
*--sp = 0x00; /* R0 */
|
||||
|
||||
/* SREG:
|
||||
---------------------------------
|
||||
| I | T | H | S | V | N | Z | C |
|
||||
|--------------------------------
|
||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|
||||
---------------------------------
|
||||
*/
|
||||
*--sp = 0x80; /* SREG */
|
||||
|
||||
*--sp = 0x01; /* R1 */
|
||||
*--sp = 0x02; /* R2 */
|
||||
*--sp = 0x03; /* R3 */
|
||||
*--sp = 0x04; /* R4 */
|
||||
*--sp = 0x05; /* R5 */
|
||||
*--sp = 0x06; /* R6 */
|
||||
*--sp = 0x07; /* R7 */
|
||||
*--sp = 0x08; /* R8 */
|
||||
*--sp = 0x09; /* R9 */
|
||||
*--sp = 0x10; /* R10 */
|
||||
*--sp = 0x11; /* R11 */
|
||||
*--sp = 0x12; /* R12 */
|
||||
*--sp = 0x13; /* R13 */
|
||||
*--sp = 0x14; /* R14 */
|
||||
*--sp = 0x15; /* R15 */
|
||||
*--sp = 0x16; /* R16 */
|
||||
*--sp = 0x17; /* R17 */
|
||||
*--sp = 0x18; /* R18 */
|
||||
*--sp = 0x19; /* R19 */
|
||||
*--sp = 0x20; /* R20 */
|
||||
*--sp = 0x21; /* R21 */
|
||||
*--sp = 0x22; /* R22 */
|
||||
*--sp = 0x23; /* R23 */
|
||||
|
||||
*--sp = (cpu_data_t)((uint16_t)arg & 0xFF); /* R24 */
|
||||
*--sp = (cpu_data_t)(((uint16_t)arg >> 8) & 0xFF); /* R25 */
|
||||
|
||||
*--sp = 0x26; /* R26 X */
|
||||
*--sp = 0x27; /* R27 */
|
||||
*--sp = 0x28; /* R28 Y */
|
||||
*--sp = 0x29; /* R29 */
|
||||
*--sp = 0x30; /* R30 Z */
|
||||
*--sp = 0x31; /* R31 */
|
||||
|
||||
/* ATTENTION:
|
||||
must do a sp decrease here in AVR
|
||||
*/
|
||||
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];
|
||||
|
||||
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
|
||||
|
||||
#if TOS_CFG_FAULT_BACKTRACE_EN > 0u
|
||||
|
||||
__KNL__ void cpu_fault_diagnosis(void)
|
||||
{
|
||||
port_fault_diagnosis();
|
||||
}
|
||||
|
||||
#endif /* TOS_CFG_FAULT_BACKTRACE_EN */
|
||||
|
205
arch/avr/common/tos_fault.c
Normal file
205
arch/avr/common/tos_fault.c
Normal file
@@ -0,0 +1,205 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* 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"
|
||||
|
||||
#if TOS_CFG_FAULT_BACKTRACE_EN > 0u
|
||||
|
||||
__STATIC_INLINE__ void fault_spin(void)
|
||||
{
|
||||
tos_knl_sched_lock();
|
||||
tos_cpu_int_disable();
|
||||
while (K_TRUE) {
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
/* EXC_RETURN:
|
||||
31 - 28 : EXC_RETURN flag
|
||||
27 - 5 : reserved
|
||||
4 : 1, basic stack frame; 0, extended stack frame
|
||||
3 : 1, return to Thread mode; 0, return to Handler mode
|
||||
2 : 1, return to PSP; 0, return to MSP
|
||||
1 : reserved, 0
|
||||
0 : reserved, 1
|
||||
*/
|
||||
__STATIC_INLINE__ int fault_is_on_task(cpu_data_t lr)
|
||||
{
|
||||
return (lr & (1u << 2)) != 0;
|
||||
}
|
||||
|
||||
__STATIC_INLINE__ int fault_is_thumb(cpu_data_t psr)
|
||||
{
|
||||
return (psr & (1u << 24)) != 0;
|
||||
}
|
||||
|
||||
__STATIC_INLINE__ int fault_is_code(fault_info_t *info, cpu_data_t value)
|
||||
{
|
||||
return value >= info->code_start && value <= info->code_limit;
|
||||
}
|
||||
|
||||
__STATIC__ void fault_dump_cpu_frame(fault_cpu_frame_t *cpu_frame)
|
||||
{
|
||||
k_fault_log_writer("\n\n====================== CPU Registers =======================\n");
|
||||
k_fault_log_writer(" %s: %08x %s: %08x %s: %08x %s: %08x\n",
|
||||
"R0 ", cpu_frame->r0,
|
||||
"R1 ", cpu_frame->r1,
|
||||
"R2 ", cpu_frame->r2,
|
||||
"R3 ", cpu_frame->r3);
|
||||
k_fault_log_writer(" %s: %08x %s: %08x %s: %08x %s: %08x\n",
|
||||
"R12", cpu_frame->r12,
|
||||
"LR ", cpu_frame->lr,
|
||||
"PC ", cpu_frame->pc,
|
||||
"PSR", cpu_frame->spsr);
|
||||
}
|
||||
|
||||
__STATIC__ void fault_dump_stack(fault_info_t *info, size_t depth)
|
||||
{
|
||||
cpu_addr_t sp = info->sp_before_fault;;
|
||||
|
||||
k_fault_log_writer("\nTASK STACK DUMP:\n");
|
||||
while (sp <= info->stack_limit && depth--) {
|
||||
k_fault_log_writer(" addr: %08x data: %08x\n", sp, (cpu_data_t)*(cpu_data_t *)sp);
|
||||
sp += sizeof(cpu_addr_t);
|
||||
}
|
||||
}
|
||||
|
||||
__STATIC__ void fault_call_stack_backtrace(fault_info_t *info, size_t depth)
|
||||
{
|
||||
cpu_data_t value;
|
||||
cpu_addr_t sp = info->sp_before_fault;
|
||||
|
||||
if (info->is_stk_ovrf) {
|
||||
return;
|
||||
}
|
||||
|
||||
k_fault_log_writer("\n\n====================== Dump Call Stack =====================\n");
|
||||
|
||||
k_fault_log_writer(" %x\n", info->pc);
|
||||
|
||||
/* walk through the stack, check every content on stack whether is a instruction(code) */
|
||||
for (; sp < info->stack_limit && depth; sp += sizeof(cpu_addr_t)) {
|
||||
value = *((cpu_addr_t *)sp) - sizeof(cpu_addr_t);
|
||||
|
||||
/* if thumb, a instruction's first bit must be 1 */
|
||||
if (info->is_thumb && !(value & 1)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (fault_is_code(info, value)) {
|
||||
k_fault_log_writer(" %x\n", value);
|
||||
--depth;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__STATIC__ void fault_dump_task(fault_info_t *info)
|
||||
{
|
||||
k_task_t *task;
|
||||
|
||||
if (!info->is_on_task) {
|
||||
return;
|
||||
}
|
||||
|
||||
task = k_curr_task;
|
||||
k_fault_log_writer("\n\n====================== Fault on task =======================\n");
|
||||
k_fault_log_writer(" TASK NAME: %s\n", task->name);
|
||||
k_fault_log_writer(" STK BASE: %x\n", info->stack_start);
|
||||
k_fault_log_writer(" STK SIZE: %x\n", task->stk_size * sizeof(k_stack_t));
|
||||
k_fault_log_writer(" STK LIMIT: %x\n", info->stack_limit);
|
||||
|
||||
if (!info->is_stk_ovrf) {
|
||||
fault_dump_stack(info, K_FAULT_STACK_DUMP_DEPTH);
|
||||
}
|
||||
}
|
||||
|
||||
__STATIC__ void fault_dump_information(fault_info_t *info)
|
||||
{
|
||||
k_fault_log_writer("\n\n================== Dump Fault Information ==================\n");
|
||||
k_fault_log_writer(" THUMB: %s\n", info->is_thumb ? "TRUE" : "FALSE");
|
||||
k_fault_log_writer(" ON TASK: %s\n", info->is_on_task? "TRUE" : "FALSE");
|
||||
k_fault_log_writer(" STK OVRF: %s\n", info->is_stk_ovrf? "TRUE" : "FALSE");
|
||||
|
||||
k_fault_log_writer(" PC: %08x\n", info->pc);
|
||||
k_fault_log_writer(" SP: %08x\n", info->sp_before_fault);
|
||||
k_fault_log_writer(" STK START: %08x\n", info->stack_start);
|
||||
k_fault_log_writer(" STK LIMIT: %08x\n", info->stack_limit);
|
||||
k_fault_log_writer(" COD START: %08x\n", info->code_start);
|
||||
k_fault_log_writer(" COD LIMIT: %08x\n", info->code_limit);
|
||||
}
|
||||
|
||||
__STATIC__ void fault_gather_information(cpu_data_t lr, fault_exc_frame_t *frame, fault_info_t *info)
|
||||
{
|
||||
info->is_thumb = fault_is_thumb(frame->cpu_frame.spsr);
|
||||
info->is_on_task = fault_is_on_task(lr);
|
||||
|
||||
info->pc = frame->cpu_frame.pc;
|
||||
|
||||
info->sp_before_fault = (cpu_addr_t)frame + sizeof(fault_cpu_frame_t);
|
||||
|
||||
info->code_start = fault_code_start();
|
||||
info->code_limit = fault_code_limit();
|
||||
|
||||
if (info->is_on_task) {
|
||||
info->stack_start = (cpu_addr_t)k_curr_task->stk_base;
|
||||
info->stack_limit = info->stack_start + k_curr_task->stk_size * sizeof(k_task_t);
|
||||
} else {
|
||||
info->stack_start = fault_msp_start();
|
||||
info->stack_limit = fault_msp_limit();
|
||||
}
|
||||
|
||||
info->is_stk_ovrf = (info->sp_before_fault < info->stack_start || info->sp_before_fault > info->stack_limit);
|
||||
}
|
||||
|
||||
__KNL__ int fault_default_log_writer(const char *format, ...)
|
||||
{
|
||||
int len;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
len = vprintf(format, ap);
|
||||
va_end(ap);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
__API__ void tos_fault_log_writer_set(k_fault_log_writer_t log_writer)
|
||||
{
|
||||
k_fault_log_writer = log_writer;
|
||||
}
|
||||
|
||||
__KNL__ void fault_backtrace(cpu_addr_t lr, fault_exc_frame_t *frame)
|
||||
{
|
||||
fault_info_t info;
|
||||
|
||||
fault_gather_information(lr, frame, &info);
|
||||
|
||||
fault_dump_information(&info);
|
||||
|
||||
fault_dump_task(&info);
|
||||
|
||||
fault_dump_cpu_frame(&frame->cpu_frame);
|
||||
|
||||
fault_call_stack_backtrace(&info, K_FAULT_CALL_STACK_BACKTRACE_DEPTH);
|
||||
|
||||
cpu_fault_diagnosis();
|
||||
|
||||
fault_spin();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
70
arch/stm8/iccstm8/port.h
Normal file
70
arch/stm8/iccstm8/port.h
Normal file
@@ -0,0 +1,70 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* 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 defined(TOS_CFG_CPU_LEAD_ZEROS_ASM_PRESENT) && (TOS_CFG_CPU_LEAD_ZEROS_ASM_PRESENT == 1u)
|
||||
__PORT__ uint32_t port_clz(uint32_t val);
|
||||
#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_ */
|
||||
|
296
arch/stm8/iccstm8/port_c.c
Normal file
296
arch/stm8/iccstm8/port_c.c
Normal file
@@ -0,0 +1,296 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* 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.
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2016-2018 Armink (armink.ztl@gmail.com)
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* 'Software'), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "tos_k.h"
|
||||
|
||||
__PORT__ void port_cpu_reset(void)
|
||||
{
|
||||
#if 0
|
||||
NVIC_SystemReset();
|
||||
#endif
|
||||
}
|
||||
|
||||
__PORT__ void port_systick_config(uint32_t cycle_per_tick)
|
||||
{
|
||||
#if 0
|
||||
(void)SysTick_Config(cycle_per_tick);
|
||||
#endif
|
||||
}
|
||||
|
||||
__PORT__ void port_systick_priority_set(uint32_t prio)
|
||||
{
|
||||
#if 0
|
||||
NVIC_SetPriority(SysTick_IRQn, prio);
|
||||
#endif
|
||||
}
|
||||
|
||||
#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 = SysTick_LOAD_RELOAD_Msk; // 24 bit
|
||||
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)
|
||||
{
|
||||
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
}
|
||||
|
||||
__PORT__ void port_systick_suspend(void)
|
||||
{
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
|
||||
}
|
||||
|
||||
__PORT__ k_cycle_t port_systick_max_reload_cycle(void)
|
||||
{
|
||||
return SysTick_LOAD_RELOAD_Msk;
|
||||
}
|
||||
|
||||
__PORT__ void port_systick_reload(uint32_t cycle_per_tick)
|
||||
{
|
||||
uint32_t max_cycle;
|
||||
|
||||
max_cycle = SysTick_LOAD_RELOAD_Msk; // 24 bit
|
||||
|
||||
if (max_cycle - SysTick->VAL > cycle_per_tick - 1u) {
|
||||
SysTick->LOAD = max_cycle;
|
||||
} else {
|
||||
SysTick->LOAD = (cycle_per_tick - 1u) + SysTick->VAL;
|
||||
}
|
||||
|
||||
SysTick->VAL = 0;
|
||||
}
|
||||
|
||||
__PORT__ void port_systick_pending_reset(void)
|
||||
{
|
||||
SCB->ICSR |= SCB_ICSR_PENDSTCLR_Msk;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if TOS_CFG_PWR_MGR_EN > 0u
|
||||
|
||||
__PORT__ void port_sleep_mode_enter(void)
|
||||
{
|
||||
#if 1
|
||||
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
|
||||
#else
|
||||
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
|
||||
#endif
|
||||
}
|
||||
|
||||
__PORT__ void port_stop_mode_enter(void)
|
||||
{
|
||||
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
|
||||
}
|
||||
|
||||
__PORT__ void port_standby_mode_enter(void)
|
||||
{
|
||||
HAL_PWR_EnterSTANDBYMode();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if TOS_CFG_FAULT_BACKTRACE_EN > 0u
|
||||
__STATIC__ void port_fault_do_diagnosis(port_fault_regs_t *regs)
|
||||
{
|
||||
k_fault_log_writer("\n\n====================== Fault Diagnosis =====================\n");
|
||||
|
||||
if (regs->hfsr.bits.VECTBL) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_HFSR_VECTBL]);
|
||||
}
|
||||
if (regs->hfsr.bits.FORCED) {
|
||||
/* Memory Management Fault */
|
||||
if (regs->cfsr.part.mfsr.value) {
|
||||
if (regs->cfsr.part.mfsr.bits.IACCVIOL) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_MFSR_IACCVIOL]);
|
||||
}
|
||||
if (regs->cfsr.part.mfsr.bits.DACCVIOL) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_MFSR_DACCVIOL]);
|
||||
}
|
||||
if (regs->cfsr.part.mfsr.bits.MUNSTKERR) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_MFSR_MUNSTKERR]);
|
||||
}
|
||||
if (regs->cfsr.part.mfsr.bits.MSTKERR) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_MFSR_MSTKERR]);
|
||||
}
|
||||
|
||||
if (regs->cfsr.part.mfsr.bits.MLSPERR) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_MFSR_MLSPERR]);
|
||||
}
|
||||
|
||||
if (regs->cfsr.part.mfsr.bits.MMARVALID) {
|
||||
if (regs->cfsr.part.mfsr.bits.IACCVIOL || regs->cfsr.part.mfsr.bits.DACCVIOL) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_MMAR], regs->mmar);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Bus Fault */
|
||||
if (regs->cfsr.part.bfsr.value) {
|
||||
if (regs->cfsr.part.bfsr.bits.IBUSERR) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_BFSR_IBUSERR]);
|
||||
}
|
||||
if (regs->cfsr.part.bfsr.bits.PRECISERR) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_BFSR_PRECISERR]);
|
||||
}
|
||||
if (regs->cfsr.part.bfsr.bits.IMPREISERR) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_BFSR_IMPREISERR]);
|
||||
}
|
||||
if (regs->cfsr.part.bfsr.bits.UNSTKERR) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_BFSR_UNSTKERR]);
|
||||
}
|
||||
if (regs->cfsr.part.bfsr.bits.STKERR) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_BFSR_STKERR]);
|
||||
}
|
||||
|
||||
if (regs->cfsr.part.bfsr.bits.LSPERR) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_BFSR_LSPERR]);
|
||||
}
|
||||
|
||||
if (regs->cfsr.part.bfsr.bits.BFARVALID) {
|
||||
if (regs->cfsr.part.bfsr.bits.PRECISERR) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_BFAR], regs->bfar);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/* Usage Fault */
|
||||
if (regs->cfsr.part.ufsr.value) {
|
||||
if (regs->cfsr.part.ufsr.bits.UNDEFINSTR) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_UFSR_UNDEFINSTR]);
|
||||
}
|
||||
if (regs->cfsr.part.ufsr.bits.INVSTATE) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_UFSR_INVSTATE]);
|
||||
}
|
||||
if (regs->cfsr.part.ufsr.bits.INVPC) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_UFSR_INVPC]);
|
||||
}
|
||||
if (regs->cfsr.part.ufsr.bits.NOCP) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_UFSR_NOCP]);
|
||||
}
|
||||
if (regs->cfsr.part.ufsr.bits.UNALIGNED) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_UFSR_UNALIGNED]);
|
||||
}
|
||||
if (regs->cfsr.part.ufsr.bits.DIVBYZERO0) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_UFSR_DIVBYZERO0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Debug Fault */
|
||||
if (regs->hfsr.bits.DEBUGEVT) {
|
||||
if (regs->dfsr.value) {
|
||||
if (regs->dfsr.bits.HALTED) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_DFSR_HALTED]);
|
||||
}
|
||||
if (regs->dfsr.bits.BKPT) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_DFSR_BKPT]);
|
||||
}
|
||||
if (regs->dfsr.bits.DWTTRAP) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_DFSR_DWTTRAP]);
|
||||
}
|
||||
if (regs->dfsr.bits.VCATCH) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_DFSR_VCATCH]);
|
||||
}
|
||||
if (regs->dfsr.bits.EXTERNAL) {
|
||||
k_fault_log_writer(fault_msg[FAULT_INFO_DFSR_EXTERNAL]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__PORT__ void port_fault_diagnosis(void)
|
||||
{
|
||||
port_fault_regs_t regs;
|
||||
|
||||
regs.syshndctrl.value = SCB->SHCSR;
|
||||
regs.cfsr.value = SCB->CFSR;
|
||||
regs.mmar = SCB->MMFAR;
|
||||
regs.bfar = SCB->BFAR;
|
||||
regs.hfsr.value = SCB->HFSR;
|
||||
regs.dfsr.value = SCB->DFSR;
|
||||
regs.afsr = SCB->AFSR;
|
||||
|
||||
port_fault_do_diagnosis(®s);
|
||||
}
|
||||
|
||||
/*------------------ RealView Compiler -----------------*/
|
||||
/* V5 */
|
||||
#if defined(__CC_ARM)
|
||||
|
||||
__PORT__ __ASM__ void HardFault_Handler(void)
|
||||
{
|
||||
IMPORT fault_backtrace
|
||||
|
||||
MOV r0, lr
|
||||
TST lr, #0x04
|
||||
ITE EQ
|
||||
MRSEQ r1, MSP
|
||||
MRSNE r1, PSP
|
||||
BL fault_backtrace
|
||||
}
|
||||
|
||||
/*------------------ ARM Compiler V6 -------------------*/
|
||||
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||
|
||||
__PORT__ void __NAKED__ HardFault_Handler(void)
|
||||
{
|
||||
__ASM__ __VOLATILE__ (
|
||||
"MOV r0, lr\n\t"
|
||||
"TST lr, #0x04\n\t"
|
||||
"ITE EQ\n\t"
|
||||
"MRSEQ r1, MSP\n\t"
|
||||
"MRSNE r1, PSP\n\t"
|
||||
"BL fault_backtrace\n\t"
|
||||
);
|
||||
}
|
||||
|
||||
#endif /* ARMCC VERSION */
|
||||
|
||||
#endif /* TOS_CFG_FAULT_BACKTRACE_EN */
|
||||
|
30
arch/stm8/iccstm8/port_config.h
Normal file
30
arch/stm8/iccstm8/port_config.h
Normal file
@@ -0,0 +1,30 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* 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_08
|
||||
#define TOS_CFG_CPU_DATA_SIZE CPU_WORD_SIZE_08
|
||||
#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 0u
|
||||
|
||||
#define TOS_CFG_CPU_ARM_FPU_EN 0u
|
||||
|
||||
#endif /* _PORT_CONFIG_H_ */
|
||||
|
@@ -70,7 +70,7 @@ _context_save:
|
||||
LDW (X), Y
|
||||
|
||||
_context_restore:
|
||||
; k_curr_task = k_next_task
|
||||
/* k_curr_task = k_next_task */
|
||||
LDW X, k_next_task
|
||||
LDW Y, #k_curr_task /* equals to: "ldr r0, =k_curr_task "*/
|
||||
LDW (Y), X
|
BIN
board/ATMega32/ATmega16_MINI_BOARD_SCH.pdf
Normal file
BIN
board/ATMega32/ATmega16_MINI_BOARD_SCH.pdf
Normal file
Binary file not shown.
7
board/ATMega32/BSP/include/tim.h
Normal file
7
board/ATMega32/BSP/include/tim.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef __TIM_H_
|
||||
#define __TIM_H_
|
||||
|
||||
// void Timer2_Init(uint32_t clock, uint32_t tick_per_second);
|
||||
|
||||
#endif
|
||||
|
13
board/ATMega32/BSP/include/uart.h
Normal file
13
board/ATMega32/BSP/include/uart.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#ifndef __USART_H_
|
||||
#define __USART_H_
|
||||
|
||||
void uart_send_byte(char data);
|
||||
|
||||
void uart_send_string(char *string);
|
||||
|
||||
unsigned char uart_receive(void);
|
||||
|
||||
void uart_init(unsigned int baudrate);
|
||||
|
||||
#endif
|
||||
|
20
board/ATMega32/BSP/src/hal_uart.c
Normal file
20
board/ATMega32/BSP/src/hal_uart.c
Normal file
@@ -0,0 +1,20 @@
|
||||
#if 0
|
||||
|
||||
#include "tos_hal.h"
|
||||
|
||||
int tos_hal_uart_init(hal_uart_t *uart, hal_uart_port_t port)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int tos_hal_uart_write(hal_uart_t *uart, const uint8_t *buf, size_t size, uint32_t timeout)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < size; ++i) {
|
||||
uart_send_byte(buf[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
12
board/ATMega32/BSP/src/tim.c
Normal file
12
board/ATMega32/BSP/src/tim.c
Normal file
@@ -0,0 +1,12 @@
|
||||
#include "iom32.h"
|
||||
#include "tim.h"
|
||||
|
||||
void timer1(void)
|
||||
{
|
||||
TCCR1B = 0X00;
|
||||
TCNT1 = 0;
|
||||
OCR1B = 800;
|
||||
TIMSK |= (1 << OCIE1B) | (1 << TOIE1);
|
||||
TCCR1A = (1 << COM1B1) | (1 << WGM10) | (1 << WGM11);
|
||||
TCCR1B = (0 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
|
||||
}
|
47
board/ATMega32/BSP/src/uart.c
Normal file
47
board/ATMega32/BSP/src/uart.c
Normal file
@@ -0,0 +1,47 @@
|
||||
#include "iom32.h"
|
||||
#include "uart.h"
|
||||
|
||||
#define F_CPU 16777216
|
||||
|
||||
void uart_send_byte(char data)
|
||||
{
|
||||
while (!(UCSRA & (1 << UDRE))) {
|
||||
;
|
||||
}
|
||||
UDR = data;
|
||||
}
|
||||
|
||||
void uart_send_string(char *string)
|
||||
{
|
||||
for(; *string!='\0'; string++) {
|
||||
uart_send_byte(*string);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned char uart_receive(void)
|
||||
{
|
||||
while (!(UCSRA & (1 << RXC))) {
|
||||
;
|
||||
}
|
||||
return UDR;
|
||||
}
|
||||
|
||||
int putchar(int data)
|
||||
{
|
||||
uart_send_byte(data);
|
||||
}
|
||||
|
||||
void uart_init(unsigned int baudrate)
|
||||
{
|
||||
unsigned int tmp;
|
||||
tmp = F_CPU / baudrate / 16 - 1;
|
||||
|
||||
/* Set baud rate */
|
||||
UBRRH = (unsigned char)(tmp >> 8);
|
||||
UBRRL = (unsigned char)tmp;
|
||||
/* Enable receiver and transmitter, enable receive interrupt */
|
||||
UCSRB = (1 << RXCIE) | (1 << RXEN) | (1 << TXEN);
|
||||
/* 8bit, 1 stopbit */
|
||||
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1<< UCSZ0);
|
||||
}
|
||||
|
1275
board/ATMega32/IAR/hello_world-iar4.12/TencentOS_tiny.ewd
Normal file
1275
board/ATMega32/IAR/hello_world-iar4.12/TencentOS_tiny.ewd
Normal file
File diff suppressed because it is too large
Load Diff
2081
board/ATMega32/IAR/hello_world-iar4.12/TencentOS_tiny.ewp
Normal file
2081
board/ATMega32/IAR/hello_world-iar4.12/TencentOS_tiny.ewp
Normal file
File diff suppressed because it is too large
Load Diff
10
board/ATMega32/IAR/hello_world-iar4.12/TencentOS_tiny.eww
Normal file
10
board/ATMega32/IAR/hello_world-iar4.12/TencentOS_tiny.eww
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\TencentOS_tiny.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
@@ -0,0 +1,176 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<Project>
|
||||
<Desktop>
|
||||
<Static>
|
||||
<Debug-Log/>
|
||||
<Workspace>
|
||||
<ColumnWidths>
|
||||
|
||||
|
||||
|
||||
|
||||
<Column0>160</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>
|
||||
</Workspace>
|
||||
<Disassembly>
|
||||
|
||||
|
||||
|
||||
<MixedMode>1</MixedMode><CodeCovEnabled>0</CodeCovEnabled><CodeCovShow>0</CodeCovShow></Disassembly>
|
||||
<Build>
|
||||
<ColumnWidth0>20</ColumnWidth0>
|
||||
<ColumnWidth1>1395</ColumnWidth1>
|
||||
<ColumnWidth2>372</ColumnWidth2>
|
||||
<ColumnWidth3>93</ColumnWidth3>
|
||||
</Build>
|
||||
<Register/>
|
||||
<Watch>
|
||||
<Format>
|
||||
<struct_types/>
|
||||
<watch_formats/>
|
||||
</Format>
|
||||
</Watch>
|
||||
<QuickWatch>
|
||||
<Column0>100</Column0>
|
||||
<Column1>136</Column1>
|
||||
<Column2>120</Column2>
|
||||
<Column3>100</Column3>
|
||||
</QuickWatch>
|
||||
<Memory>
|
||||
|
||||
|
||||
<FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory>
|
||||
<StaticWatch>
|
||||
|
||||
|
||||
|
||||
|
||||
<Column0>138</Column0><Column1>164</Column1><Column2>131</Column2><Column3>100</Column3></StaticWatch>
|
||||
<Breakpoints/></Static>
|
||||
<Windows>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<Wnd6>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-3758-6520</Identity>
|
||||
<TabName>Debug Log</TabName>
|
||||
<Factory>Debug-Log</Factory>
|
||||
<Session/>
|
||||
</Tab>
|
||||
<Tab>
|
||||
<Identity>TabID-3236-6530</Identity>
|
||||
<TabName>Build</TabName>
|
||||
<Factory>Build</Factory>
|
||||
<Session/>
|
||||
</Tab>
|
||||
<Tab><Identity>TabID-1907-2220</Identity><TabName>Breakpoints</TabName><Factory>Breakpoints</Factory><Session/></Tab></Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd6><Wnd7>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-14507-6524</Identity>
|
||||
<TabName>Workspace</TabName>
|
||||
<Factory>Workspace</Factory>
|
||||
<Session>
|
||||
|
||||
<NodeDict><ExpandedNode>TencentOS_tiny</ExpandedNode><ExpandedNode>TencentOS_tiny/ARCH</ExpandedNode><ExpandedNode>TencentOS_tiny/KERNEL</ExpandedNode><ExpandedNode>TencentOS_tiny/TOS-CONFIG</ExpandedNode></NodeDict></Session>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd7><Wnd8>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-25255-6527</Identity>
|
||||
<TabName>Disassembly</TabName>
|
||||
<Factory>Disassembly</Factory>
|
||||
<Session/>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd8><Wnd9>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-15366-20631</Identity>
|
||||
<TabName>Register</TabName>
|
||||
<Factory>Register</Factory>
|
||||
<Session>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<REG1>0</REG1><REG2>0</REG2><Group>0</Group><States>2</States><State0>SP</State0><State1>SREG</State1></Session>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd9><Wnd10>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-24611-31306</Identity>
|
||||
<TabName>Quick Watch</TabName>
|
||||
<Factory>QuickWatch</Factory>
|
||||
<Session>
|
||||
<Expression>k_curr_task</Expression>
|
||||
</Session>
|
||||
</Tab>
|
||||
<Tab>
|
||||
<Identity>TabID-28985-25270</Identity>
|
||||
<TabName>Live Watch</TabName>
|
||||
<Factory>StaticWatch</Factory>
|
||||
<Session>
|
||||
<Expressions>
|
||||
|
||||
|
||||
<Expression><Expression>k_curr_task</Expression></Expression><Expression><Expression>k_next_task</Expression></Expression><Expression><Expression>k_rdyq</Expression></Expression></Expressions>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<TabId>0</TabId><Column0>138</Column0><Column1>164</Column1><Column2>131</Column2><Column3>100</Column3></Session>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>1</SelectedTab></Wnd10><Wnd11>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-29862-15633</Identity>
|
||||
<TabName>Memory</TabName>
|
||||
<Factory>Memory</Factory>
|
||||
<Session>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<ZoneNumber>1</ZoneNumber><SelectionAnchor>744</SelectionAnchor><SelectionEnd>744</SelectionEnd><UnitsPerGroup>1</UnitsPerGroup><EndianMode>0</EndianMode><DataCovEnabled>0</DataCovEnabled><DataCovShown>0</DataCovShown><HScroll>0</HScroll><VScroll>46</VScroll></Session>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd11></Windows>
|
||||
<Editor>
|
||||
|
||||
|
||||
|
||||
|
||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_task.c</Filename><XPos>0</XPos><YPos>327</YPos><SelStart>8770</SelStart><SelEnd>8770</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\board\ATmega32\BSP\src\tim.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>176</SelStart><SelEnd>176</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_sem.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\arch\AVR\common\tos_cpu.c</Filename><XPos>0</XPos><YPos>102</YPos><SelStart>2470</SelStart><SelEnd>2470</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\include\tos_list.h</Filename><XPos>0</XPos><YPos>127</YPos><SelStart>4515</SelStart><SelEnd>4515</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_timer.c</Filename><XPos>0</XPos><YPos>268</YPos><SelStart>7654</SelStart><SelEnd>7654</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\board\ATMega32\TOS-CONFIG\tos_config.h</Filename><XPos>0</XPos><YPos>15</YPos><SelStart>843</SelStart><SelEnd>843</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_sched.c</Filename><XPos>0</XPos><YPos>67</YPos><SelStart>2376</SelStart><SelEnd>2376</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_tick.c</Filename><XPos>0</XPos><YPos>93</YPos><SelStart>3338</SelStart><SelEnd>3338</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\arch\avr\ATMega32\iccavr\port_s.asm</Filename><XPos>0</XPos><YPos>63</YPos><SelStart>1017</SelStart><SelEnd>1017</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\board\ATmega32\USER\main.c</Filename><XPos>0</XPos><YPos>64</YPos><SelStart>1307</SelStart><SelEnd>1307</SelEnd></Tab><ActiveTab>10</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_sys.c</Filename><XPos>0</XPos><YPos>94</YPos><SelStart>2465</SelStart><SelEnd>2465</SelEnd></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
||||
<Positions>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<Top><Row0><Sizes><Toolbar-01df9cf0><key>iaridepm1</key></Toolbar-01df9cf0></Sizes></Row0><Row1><Sizes><Toolbar-01e89c00><key>debuggergui1</key></Toolbar-01e89c00></Sizes></Row1></Top><Left><Row0><Sizes><Wnd7><Rect><Top>-2</Top><Left>-2</Left><Bottom>459</Bottom><Right>251</Right><x>-2</x><y>-2</y><xscreen>364</xscreen><yscreen>409</yscreen><sizeHorzCX>189583</sizeHorzCX><sizeHorzCY>447484</sizeHorzCY><sizeVertCX>131771</sizeVertCX><sizeVertCY>504376</sizeVertCY></Rect></Wnd7></Sizes></Row0></Left><Right><Row0><Sizes><Wnd8><Rect><Top>-2</Top><Left>-2</Left><Bottom>459</Bottom><Right>630</Right><x>-2</x><y>-2</y><xscreen>364</xscreen><yscreen>409</yscreen><sizeHorzCX>189583</sizeHorzCX><sizeHorzCY>447484</sizeHorzCY><sizeVertCX>329167</sizeVertCX><sizeVertCY>504376</sizeVertCY></Rect></Wnd8></Sizes></Row0><Row1><Sizes><Wnd9><Rect><Top>-2</Top><Left>628</Left><Bottom>459</Bottom><Right>985</Right><x>628</x><y>-2</y><xscreen>364</xscreen><yscreen>409</yscreen><sizeHorzCX>189583</sizeHorzCX><sizeHorzCY>447484</sizeHorzCY><sizeVertCX>185938</sizeVertCX><sizeVertCY>504376</sizeVertCY></Rect></Wnd9></Sizes></Row1><Row2><Sizes><Wnd10><Rect><Top>-2</Top><Left>983</Left><Bottom>459</Bottom><Right>1220</Right><x>983</x><y>-2</y><xscreen>364</xscreen><yscreen>409</yscreen><sizeHorzCX>189583</sizeHorzCX><sizeHorzCY>447484</sizeHorzCY><sizeVertCX>123438</sizeVertCX><sizeVertCY>504376</sizeVertCY></Rect></Wnd10></Sizes></Row2></Right><Bottom><Row0><Sizes><Wnd6><Rect><Top>-2</Top><Left>-2</Left><Bottom>241</Bottom><Right>1922</Right><x>-2</x><y>-2</y><xscreen>1924</xscreen><yscreen>243</yscreen><sizeHorzCX>1002083</sizeHorzCX><sizeHorzCY>265864</sizeHorzCY><sizeVertCX>189583</sizeVertCX><sizeVertCY>447484</sizeVertCY></Rect></Wnd6></Sizes></Row0><Row1><Sizes><Wnd11><Rect><Top>239</Top><Left>-2</Left><Bottom>386</Bottom><Right>1922</Right><x>-2</x><y>239</y><xscreen>1924</xscreen><yscreen>147</yscreen><sizeHorzCX>1002083</sizeHorzCX><sizeHorzCY>160832</sizeHorzCY><sizeVertCX>189583</sizeVertCX><sizeVertCY>447484</sizeVertCY></Rect></Wnd11></Sizes></Row1></Bottom><Float><Sizes/></Float></Positions>
|
||||
</Desktop>
|
||||
</Project>
|
||||
|
||||
|
@@ -0,0 +1,18 @@
|
||||
[DisAssemblyWindow]
|
||||
NumStates=_ 1
|
||||
State 1=_ 1
|
||||
[TraceHelper]
|
||||
Enabled=0
|
||||
ShowSource=1
|
||||
[Log file]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
Category=_ 0
|
||||
[TermIOLog]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
[Breakpoints]
|
||||
Bp0=_ "Code" "{D:\TOS\TencentOS-tiny\kernel\core\tos_sys.c}.107.5@1" 0 0 0 0 "" 0 ""
|
||||
Bp1=_ "Code" "{D:\TOS\TencentOS-tiny\kernel\core\tos_sys.c}.101.19@1" 0 0 0 0 "" 0 ""
|
||||
Bp2=_ "Code" "{D:\TOS\TencentOS-tiny\kernel\core\tos_tick.c}.112.9@1" 0 0 0 0 "" 0 ""
|
||||
Count=3
|
@@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<Workspace>
|
||||
<ConfigDictionary>
|
||||
|
||||
<CurrentConfigs><Project>TencentOS_tiny/Debug</Project></CurrentConfigs></ConfigDictionary>
|
||||
<Desktop>
|
||||
<Static>
|
||||
<Workspace>
|
||||
<ColumnWidths>
|
||||
|
||||
|
||||
|
||||
|
||||
<Column0>130</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>
|
||||
</Workspace>
|
||||
<Build>
|
||||
|
||||
|
||||
|
||||
|
||||
<ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1395</ColumnWidth1><ColumnWidth2>372</ColumnWidth2><ColumnWidth3>93</ColumnWidth3></Build>
|
||||
<TerminalIO/>
|
||||
<CodeCoveragePlugin/>
|
||||
<Profiling/>
|
||||
<Debug-Log/>
|
||||
</Static>
|
||||
<Windows>
|
||||
|
||||
|
||||
<Wnd0>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-24042-2046</Identity>
|
||||
<TabName>Workspace</TabName>
|
||||
<Factory>Workspace</Factory>
|
||||
<Session>
|
||||
|
||||
<NodeDict><ExpandedNode>TencentOS_tiny</ExpandedNode></NodeDict></Session>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd0><Wnd1>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-5514-2598</Identity>
|
||||
<TabName>Build</TabName>
|
||||
<Factory>Build</Factory>
|
||||
<Session/>
|
||||
</Tab>
|
||||
<Tab>
|
||||
<Identity>TabID-14450-14285</Identity>
|
||||
<TabName>Debug Log</TabName>
|
||||
<Factory>Debug-Log</Factory>
|
||||
<Session/>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd1></Windows>
|
||||
<Editor>
|
||||
|
||||
|
||||
|
||||
|
||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_task.c</Filename><XPos>0</XPos><YPos>327</YPos><SelStart>8770</SelStart><SelEnd>8770</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\board\ATmega32\BSP\src\tim.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>176</SelStart><SelEnd>176</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_sem.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\arch\AVR\common\tos_cpu.c</Filename><XPos>0</XPos><YPos>102</YPos><SelStart>2470</SelStart><SelEnd>2470</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\include\tos_list.h</Filename><XPos>0</XPos><YPos>127</YPos><SelStart>4515</SelStart><SelEnd>4515</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_timer.c</Filename><XPos>0</XPos><YPos>268</YPos><SelStart>7654</SelStart><SelEnd>7654</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\board\ATMega32\TOS-CONFIG\tos_config.h</Filename><XPos>0</XPos><YPos>15</YPos><SelStart>843</SelStart><SelEnd>843</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_sched.c</Filename><XPos>0</XPos><YPos>67</YPos><SelStart>2376</SelStart><SelEnd>2376</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_tick.c</Filename><XPos>0</XPos><YPos>93</YPos><SelStart>3338</SelStart><SelEnd>3338</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\arch\avr\ATMega32\iccavr\port_s.asm</Filename><XPos>0</XPos><YPos>63</YPos><SelStart>1017</SelStart><SelEnd>1017</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\board\ATmega32\USER\main.c</Filename><XPos>0</XPos><YPos>64</YPos><SelStart>1654</SelStart><SelEnd>1654</SelEnd></Tab><ActiveTab>10</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>D:\TOS\TencentOS-tiny\kernel\core\tos_sys.c</Filename><XPos>0</XPos><YPos>94</YPos><SelStart>2465</SelStart><SelEnd>2465</SelEnd></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
||||
<Positions>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<Top><Row0><Sizes><Toolbar-01df9cf0><key>iaridepm1</key></Toolbar-01df9cf0></Sizes></Row0><Row1><Sizes/></Row1></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>434</Bottom><Right>204</Right><x>-2</x><y>-2</y><xscreen>111</xscreen><yscreen>99</yscreen><sizeHorzCX>77949</sizeHorzCX><sizeHorzCY>154930</sizeHorzCY><sizeVertCX>144663</sizeVertCX><sizeVertCY>682316</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>160</Bottom><Right>1426</Right><x>-2</x><y>-2</y><xscreen>1428</xscreen><yscreen>162</yscreen><sizeHorzCX>1002809</sizeHorzCX><sizeHorzCY>253521</sizeHorzCY><sizeVertCX>77949</sizeVertCX><sizeVertCY>154930</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
||||
</Desktop>
|
||||
</Workspace>
|
||||
|
||||
|
2058
board/ATMega32/IAR/hello_world-iar7.20/TencentOS_tiny.ewd
Normal file
2058
board/ATMega32/IAR/hello_world-iar7.20/TencentOS_tiny.ewd
Normal file
File diff suppressed because it is too large
Load Diff
2259
board/ATMega32/IAR/hello_world-iar7.20/TencentOS_tiny.ewp
Normal file
2259
board/ATMega32/IAR/hello_world-iar7.20/TencentOS_tiny.ewp
Normal file
File diff suppressed because it is too large
Load Diff
2312
board/ATMega32/IAR/hello_world-iar7.20/TencentOS_tiny.ewt
Normal file
2312
board/ATMega32/IAR/hello_world-iar7.20/TencentOS_tiny.ewt
Normal file
File diff suppressed because it is too large
Load Diff
10
board/ATMega32/IAR/hello_world-iar7.20/TencentOS_tiny.eww
Normal file
10
board/ATMega32/IAR/hello_world-iar7.20/TencentOS_tiny.eww
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\TencentOS_tiny.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
@@ -0,0 +1,40 @@
|
||||
@REM This batch file has been generated by the IAR Embedded Workbench
|
||||
@REM C-SPY Debugger, as an aid to preparing a command line for running
|
||||
@REM the cspybat command line utility using the appropriate settings.
|
||||
@REM
|
||||
@REM Note that this file is generated every time a new debug session
|
||||
@REM is initialized, so you may want to move or rename the file before
|
||||
@REM making changes.
|
||||
@REM
|
||||
@REM You can launch cspybat by typing the name of this batch file followed
|
||||
@REM by the name of the debug file (usually an ELF/DWARF or UBROF file).
|
||||
@REM
|
||||
@REM Read about available command line parameters in the C-SPY Debugging
|
||||
@REM Guide. Hints about additional command line parameters that may be
|
||||
@REM useful in specific cases:
|
||||
@REM --download_only Downloads a code image without starting a debug
|
||||
@REM session afterwards.
|
||||
@REM --silent Omits the sign-on message.
|
||||
@REM --timeout Limits the maximum allowed execution time.
|
||||
@REM
|
||||
|
||||
|
||||
@echo off
|
||||
|
||||
if not "%~1" == "" goto debugFile
|
||||
|
||||
@echo on
|
||||
|
||||
"D:\Program Files\IAR Systems\Embedded Workbench 8.0 AVR\common\bin\cspybat" -f "D:\TOS\TencentOS-tiny\board\ATMega32\IAR\hello_world-iar7.20\settings\TencentOS_tiny.Debug.general.xcl" --backend -f "D:\TOS\TencentOS-tiny\board\ATMega32\IAR\hello_world-iar7.20\settings\TencentOS_tiny.Debug.driver.xcl"
|
||||
|
||||
@echo off
|
||||
goto end
|
||||
|
||||
:debugFile
|
||||
|
||||
@echo on
|
||||
|
||||
"D:\Program Files\IAR Systems\Embedded Workbench 8.0 AVR\common\bin\cspybat" -f "D:\TOS\TencentOS-tiny\board\ATMega32\IAR\hello_world-iar7.20\settings\TencentOS_tiny.Debug.general.xcl" "--debug_file=%~1" --backend -f "D:\TOS\TencentOS-tiny\board\ATMega32\IAR\hello_world-iar7.20\settings\TencentOS_tiny.Debug.driver.xcl"
|
||||
|
||||
@echo off
|
||||
:end
|
@@ -0,0 +1,31 @@
|
||||
param([String]$debugfile = "");
|
||||
|
||||
# This powershell file has been generated by the IAR Embedded Workbench
|
||||
# C - SPY Debugger, as an aid to preparing a command line for running
|
||||
# the cspybat command line utility using the appropriate settings.
|
||||
#
|
||||
# Note that this file is generated every time a new debug session
|
||||
# is initialized, so you may want to move or rename the file before
|
||||
# making changes.
|
||||
#
|
||||
# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed
|
||||
# by the name of the debug file (usually an ELF / DWARF or UBROF file).
|
||||
#
|
||||
# Read about available command line parameters in the C - SPY Debugging
|
||||
# Guide. Hints about additional command line parameters that may be
|
||||
# useful in specific cases :
|
||||
# --download_only Downloads a code image without starting a debug
|
||||
# session afterwards.
|
||||
# --silent Omits the sign - on message.
|
||||
# --timeout Limits the maximum allowed execution time.
|
||||
#
|
||||
|
||||
|
||||
if ($debugfile -eq "")
|
||||
{
|
||||
& "D:\Program Files\IAR Systems\Embedded Workbench 8.0 AVR\common\bin\cspybat" -f "D:\TOS\TencentOS-tiny\board\ATMega32\IAR\hello_world-iar7.20\settings\TencentOS_tiny.Debug.general.xcl" --backend -f "D:\TOS\TencentOS-tiny\board\ATMega32\IAR\hello_world-iar7.20\settings\TencentOS_tiny.Debug.driver.xcl"
|
||||
}
|
||||
else
|
||||
{
|
||||
& "D:\Program Files\IAR Systems\Embedded Workbench 8.0 AVR\common\bin\cspybat" -f "D:\TOS\TencentOS-tiny\board\ATMega32\IAR\hello_world-iar7.20\settings\TencentOS_tiny.Debug.general.xcl" --debug_file=$debugfile --backend -f "D:\TOS\TencentOS-tiny\board\ATMega32\IAR\hello_world-iar7.20\settings\TencentOS_tiny.Debug.driver.xcl"
|
||||
}
|
@@ -0,0 +1,15 @@
|
||||
"--cpu=m32"
|
||||
|
||||
"--enhanced_core"
|
||||
|
||||
"-p"
|
||||
|
||||
"D:\Program Files\IAR Systems\Embedded Workbench 8.0 AVR\avr\Config\iom32.ddf"
|
||||
|
||||
"--eeprom_size"
|
||||
|
||||
"1024"
|
||||
|
||||
|
||||
|
||||
|
@@ -0,0 +1,11 @@
|
||||
"D:\Program Files\IAR Systems\Embedded Workbench 8.0 AVR\avr\bin\avrproc.dll"
|
||||
|
||||
"D:\Program Files\IAR Systems\Embedded Workbench 8.0 AVR\avr\bin\avrsim.dll"
|
||||
|
||||
"D:\TOS\TencentOS-tiny\board\ATMega32\IAR\hello_world-iar7.20\Debug\Exe\TencentOS_tiny.d90"
|
||||
|
||||
--plugin "D:\Program Files\IAR Systems\Embedded Workbench 8.0 AVR\avr/bin/avrlibsupportbat.dll"
|
||||
|
||||
|
||||
|
||||
|
@@ -0,0 +1,229 @@
|
||||
<?xml version="1.0"?>
|
||||
<Project>
|
||||
<Desktop>
|
||||
<Static>
|
||||
<Debug-Log />
|
||||
<Workspace>
|
||||
<ColumnWidths>
|
||||
<Column0>194</Column0>
|
||||
<Column1>27</Column1>
|
||||
<Column2>27</Column2>
|
||||
<Column3>27</Column3>
|
||||
</ColumnWidths>
|
||||
</Workspace>
|
||||
<Disassembly>
|
||||
<MixedMode>1</MixedMode>
|
||||
<CodeCovEnabled>0</CodeCovEnabled>
|
||||
<CodeCovShow>0</CodeCovShow>
|
||||
</Disassembly>
|
||||
<Build>
|
||||
<ColumnWidth0>20</ColumnWidth0>
|
||||
<ColumnWidth1>1395</ColumnWidth1>
|
||||
<ColumnWidth2>372</ColumnWidth2>
|
||||
<ColumnWidth3>93</ColumnWidth3>
|
||||
</Build>
|
||||
</Static>
|
||||
<Windows>
|
||||
<Wnd0>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-10315-10600</Identity>
|
||||
<TabName>Debug Log</TabName>
|
||||
<Factory>Debug-Log</Factory>
|
||||
<Session />
|
||||
</Tab>
|
||||
<Tab>
|
||||
<Identity>TabID-9792-10609</Identity>
|
||||
<TabName>Build</TabName>
|
||||
<Factory>Build</Factory>
|
||||
<Session />
|
||||
</Tab>
|
||||
</Tabs>
|
||||
<SelectedTab>0</SelectedTab>
|
||||
</Wnd0>
|
||||
<Wnd1>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-21063-10603</Identity>
|
||||
<TabName>Workspace</TabName>
|
||||
<Factory>Workspace</Factory>
|
||||
<Session>
|
||||
<NodeDict>
|
||||
<ExpandedNode>TencentOS_tiny</ExpandedNode>
|
||||
</NodeDict>
|
||||
</Session>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
<SelectedTab>0</SelectedTab>
|
||||
</Wnd1>
|
||||
<Wnd2>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-31812-10606</Identity>
|
||||
<TabName>Disassembly</TabName>
|
||||
<Factory>Disassembly</Factory>
|
||||
<Session />
|
||||
</Tab>
|
||||
</Tabs>
|
||||
<SelectedTab>0</SelectedTab>
|
||||
</Wnd2>
|
||||
</Windows>
|
||||
<Editor>
|
||||
<Pane>
|
||||
<Tab>
|
||||
<Factory>TextEditor</Factory>
|
||||
<Filename>D:\Program Files\IAR Systems\Embedded Workbench 4.0 AVR\avr\INC\iom32.h</Filename>
|
||||
<XPos>0</XPos>
|
||||
<YPos>0</YPos>
|
||||
<SelStart>537</SelStart>
|
||||
<SelEnd>537</SelEnd>
|
||||
</Tab>
|
||||
<Tab>
|
||||
<Factory>TextEditor</Factory>
|
||||
<Filename>D:\TOS\TencentOS-tiny\board\ATmega32\USER\main.c</Filename>
|
||||
<XPos>0</XPos>
|
||||
<YPos>39</YPos>
|
||||
<SelStart>879</SelStart>
|
||||
<SelEnd>879</SelEnd>
|
||||
</Tab>
|
||||
<ActiveTab>1</ActiveTab>
|
||||
<Tab>
|
||||
<Factory>TextEditor</Factory>
|
||||
<Filename>D:\TOS\TencentOS-tiny\board\ATmega32\BSP\src\tim.c</Filename>
|
||||
<XPos>0</XPos>
|
||||
<YPos>0</YPos>
|
||||
<SelStart>0</SelStart>
|
||||
<SelEnd>0</SelEnd>
|
||||
</Tab>
|
||||
<Tab>
|
||||
<Factory>TextEditor</Factory>
|
||||
<Filename>D:\TOS\TencentOS-tiny\board\ATmega32\BSP\src\hal_uart.c</Filename>
|
||||
<XPos>0</XPos>
|
||||
<YPos>0</YPos>
|
||||
<SelStart>289</SelStart>
|
||||
<SelEnd>289</SelEnd>
|
||||
</Tab>
|
||||
<Tab>
|
||||
<Factory>TextEditor</Factory>
|
||||
<Filename>D:\TOS\TencentOS-tiny\board\ATmega32\BSP\include\uart.h</Filename>
|
||||
<XPos>0</XPos>
|
||||
<YPos>0</YPos>
|
||||
<SelStart>54</SelStart>
|
||||
<SelEnd>58</SelEnd>
|
||||
</Tab>
|
||||
<Tab>
|
||||
<Factory>TextEditor</Factory>
|
||||
<Filename>D:\TOS\TencentOS-tiny\board\ATmega32\BSP\src\uart.c</Filename>
|
||||
<XPos>0</XPos>
|
||||
<YPos>0</YPos>
|
||||
<SelStart>282</SelStart>
|
||||
<SelEnd>282</SelEnd>
|
||||
</Tab>
|
||||
<Tab>
|
||||
<Factory>TextEditor</Factory>
|
||||
<Filename>D:\TOS\TencentOS-tiny\board\ATmega32\BSP\include\tim.h</Filename>
|
||||
<XPos>0</XPos>
|
||||
<YPos>0</YPos>
|
||||
<SelStart>38</SelStart>
|
||||
<SelEnd>38</SelEnd>
|
||||
</Tab>
|
||||
</Pane>
|
||||
<ActivePane>0</ActivePane>
|
||||
<Sizes>
|
||||
<Pane>
|
||||
<X>1000000</X>
|
||||
<Y>1000000</Y>
|
||||
</Pane>
|
||||
</Sizes>
|
||||
<SplitMode>1</SplitMode>
|
||||
</Editor>
|
||||
<Positions>
|
||||
<Top>
|
||||
<Row0>
|
||||
<Sizes>
|
||||
<Toolbar-01df9cf0>
|
||||
<key>iaridepm1</key>
|
||||
</Toolbar-01df9cf0>
|
||||
</Sizes>
|
||||
</Row0>
|
||||
<Row1>
|
||||
<Sizes>
|
||||
<Toolbar-066c4ea0>
|
||||
<key>debuggergui1</key>
|
||||
</Toolbar-066c4ea0>
|
||||
</Sizes>
|
||||
</Row1>
|
||||
</Top>
|
||||
<Left>
|
||||
<Row0>
|
||||
<Sizes>
|
||||
<Wnd1>
|
||||
<Rect>
|
||||
<Top>-2</Top>
|
||||
<Left>-2</Left>
|
||||
<Bottom>561</Bottom>
|
||||
<Right>268</Right>
|
||||
<x>-2</x>
|
||||
<y>-2</y>
|
||||
<xscreen>270</xscreen>
|
||||
<yscreen>286</yscreen>
|
||||
<sizeHorzCX>140625</sizeHorzCX>
|
||||
<sizeHorzCY>312910</sizeHorzCY>
|
||||
<sizeVertCX>140625</sizeVertCX>
|
||||
<sizeVertCY>615974</sizeVertCY>
|
||||
</Rect>
|
||||
</Wnd1>
|
||||
</Sizes>
|
||||
</Row0>
|
||||
</Left>
|
||||
<Right>
|
||||
<Row0>
|
||||
<Sizes>
|
||||
<Wnd2>
|
||||
<Rect>
|
||||
<Top>-2</Top>
|
||||
<Left>-2</Left>
|
||||
<Bottom>561</Bottom>
|
||||
<Right>268</Right>
|
||||
<x>-2</x>
|
||||
<y>-2</y>
|
||||
<xscreen>270</xscreen>
|
||||
<yscreen>286</yscreen>
|
||||
<sizeHorzCX>140625</sizeHorzCX>
|
||||
<sizeHorzCY>312910</sizeHorzCY>
|
||||
<sizeVertCX>140625</sizeVertCX>
|
||||
<sizeVertCY>615974</sizeVertCY>
|
||||
</Rect>
|
||||
</Wnd2>
|
||||
</Sizes>
|
||||
</Row0>
|
||||
</Right>
|
||||
<Bottom>
|
||||
<Row0>
|
||||
<Sizes>
|
||||
<Wnd0>
|
||||
<Rect>
|
||||
<Top>-2</Top>
|
||||
<Left>-2</Left>
|
||||
<Bottom>284</Bottom>
|
||||
<Right>1922</Right>
|
||||
<x>-2</x>
|
||||
<y>-2</y>
|
||||
<xscreen>1924</xscreen>
|
||||
<yscreen>286</yscreen>
|
||||
<sizeHorzCX>1002083</sizeHorzCX>
|
||||
<sizeHorzCY>312910</sizeHorzCY>
|
||||
<sizeVertCX>140625</sizeVertCX>
|
||||
<sizeVertCY>312910</sizeVertCY>
|
||||
</Rect>
|
||||
</Wnd0>
|
||||
</Sizes>
|
||||
</Row0>
|
||||
</Bottom>
|
||||
<Float>
|
||||
<Sizes />
|
||||
</Float>
|
||||
</Positions>
|
||||
</Desktop>
|
||||
<WindowStorage />
|
||||
</Project>
|
@@ -0,0 +1,15 @@
|
||||
[TraceHelper]
|
||||
Enabled=0
|
||||
ShowSource=1
|
||||
[DisAssemblyWindow]
|
||||
NumStates=_ 1
|
||||
State 1=_ 1
|
||||
[Log file]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
Category=_ 0
|
||||
[TermIOLog]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
[Breakpoints]
|
||||
Count=0
|
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0"?>
|
||||
<settings>
|
||||
<TraceHelper>
|
||||
<Enabled>0</Enabled>
|
||||
<ShowSource>1</ShowSource>
|
||||
</TraceHelper>
|
||||
<DisAssemblyWindow>
|
||||
<NumStates>_ 1</NumStates>
|
||||
<State_1>_ 1</State_1>
|
||||
</DisAssemblyWindow>
|
||||
<Log_file>
|
||||
<LoggingEnabled>_ 0</LoggingEnabled>
|
||||
<LogFile>_ ""</LogFile>
|
||||
<Category>_ 0</Category>
|
||||
</Log_file>
|
||||
<TermIOLog>
|
||||
<LoggingEnabled>_ 0</LoggingEnabled>
|
||||
<LogFile>_ ""</LogFile>
|
||||
</TermIOLog>
|
||||
<Breakpoints>
|
||||
<Count>0</Count>
|
||||
</Breakpoints>
|
||||
<Stack>
|
||||
<FillEnabled>0</FillEnabled>
|
||||
<OverflowWarningsEnabled>1</OverflowWarningsEnabled>
|
||||
<WarningThreshold>90</WarningThreshold>
|
||||
<SpWarningsEnabled>1</SpWarningsEnabled>
|
||||
<WarnLogOnly>1</WarnLogOnly>
|
||||
<UseTrigger>1</UseTrigger>
|
||||
<TriggerName>main</TriggerName>
|
||||
<LimitSize>0</LimitSize>
|
||||
<ByteLimit>50</ByteLimit>
|
||||
</Stack>
|
||||
<DataLog>
|
||||
<LogEnabled>0</LogEnabled>
|
||||
<GraphEnabled>0</GraphEnabled>
|
||||
<ShowTimeLog>1</ShowTimeLog>
|
||||
<SumEnabled>0</SumEnabled>
|
||||
<ShowTimeSum>1</ShowTimeSum>
|
||||
</DataLog>
|
||||
<Breakpoints2>
|
||||
<Count>0</Count>
|
||||
</Breakpoints2>
|
||||
<Trace1>
|
||||
<Enabled>0</Enabled>
|
||||
<ShowSource>1</ShowSource>
|
||||
</Trace1>
|
||||
<Aliases>
|
||||
<Count>0</Count>
|
||||
<SuppressDialog>0</SuppressDialog>
|
||||
</Aliases>
|
||||
</settings>
|
File diff suppressed because one or more lines are too long
17
board/ATMega32/LIB/inc/stdint.h
Normal file
17
board/ATMega32/LIB/inc/stdint.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef _STDINT_H_
|
||||
#define _STDINT_H_
|
||||
|
||||
typedef unsigned char uint8_t;
|
||||
typedef char int8_t;
|
||||
|
||||
typedef unsigned short uint16_t;
|
||||
typedef signed short int16_t;
|
||||
|
||||
typedef unsigned long uint32_t;
|
||||
typedef signed long int32_t;
|
||||
|
||||
typedef unsigned long long uint64_t;
|
||||
typedef signed long long int64_t;
|
||||
|
||||
#endif
|
||||
|
53
board/ATMega32/TOS-CONFIG/tos_config.h
Normal file
53
board/ATMega32/TOS-CONFIG/tos_config.h
Normal file
@@ -0,0 +1,53 @@
|
||||
#ifndef _TOS_CONFIG_H_
|
||||
#define _TOS_CONFIG_H_
|
||||
|
||||
#define TOS_CFG_TASK_PRIO_MAX 10u
|
||||
|
||||
#define TOS_CFG_ROUND_ROBIN_EN 0u
|
||||
|
||||
#define TOS_CFG_OBJECT_VERIFY_EN 0u
|
||||
|
||||
#define TOS_CFG_TASK_DYNAMIC_CREATE_EN 0u
|
||||
|
||||
#define TOS_CFG_EVENT_EN 1u
|
||||
|
||||
#define TOS_CFG_MMBLK_EN 0u
|
||||
|
||||
#define TOS_CFG_MMHEAP_EN 0u
|
||||
|
||||
#define TOS_CFG_MMHEAP_DEFAULT_POOL_EN 1u
|
||||
|
||||
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x1000
|
||||
|
||||
#define TOS_CFG_MUTEX_EN 1u
|
||||
|
||||
#define TOS_CFG_MESSAGE_QUEUE_EN 1u
|
||||
|
||||
#define TOS_CFG_MAIL_QUEUE_EN 1u
|
||||
|
||||
#define TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN 0u
|
||||
|
||||
#define TOS_CFG_PRIORITY_MAIL_QUEUE_EN 0u
|
||||
|
||||
#define TOS_CFG_TIMER_EN 0u
|
||||
|
||||
#define TOS_CFG_PWR_MGR_EN 0u
|
||||
|
||||
#define TOS_CFG_TICKLESS_EN 0u
|
||||
|
||||
#define TOS_CFG_SEM_EN 1u
|
||||
|
||||
#define TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN 1u
|
||||
|
||||
#define TOS_CFG_FAULT_BACKTRACE_EN 0u
|
||||
|
||||
#define TOS_CFG_IDLE_TASK_STK_SIZE 128u
|
||||
|
||||
#define TOS_CFG_CPU_TICK_PER_SECOND 1000u
|
||||
|
||||
#define TOS_CFG_CPU_CLOCK (16000000)
|
||||
|
||||
#define TOS_CFG_TIMER_AS_PROC 1u
|
||||
|
||||
#endif
|
||||
|
88
board/ATMega32/USER/main.c
Normal file
88
board/ATMega32/USER/main.c
Normal file
@@ -0,0 +1,88 @@
|
||||
#include "iom32.h"
|
||||
#include "uart.h"
|
||||
#include "tos_k.h"
|
||||
|
||||
#include "stdio.h"
|
||||
|
||||
#pragma vector = TIMER1_OVF_vect
|
||||
__interrupt void TIMER1_OVF(void)
|
||||
{
|
||||
if (tos_knl_is_running()) {
|
||||
tos_knl_irq_enter();
|
||||
tos_tick_handler();
|
||||
tos_knl_irq_leave();
|
||||
}
|
||||
}
|
||||
|
||||
#pragma vector = USART_RXC_vect
|
||||
__interrupt void UART0_rx(void)
|
||||
{
|
||||
unsigned char rx_data;
|
||||
rx_data = UDR;
|
||||
}
|
||||
|
||||
void interrupt_enable(void)
|
||||
{
|
||||
SREG |= (1 << 7);
|
||||
}
|
||||
|
||||
void task1_entry(void *arg)
|
||||
{
|
||||
while (1) {
|
||||
uart_send_string("task1\r\n");
|
||||
tos_task_delay(2000);
|
||||
}
|
||||
}
|
||||
|
||||
void task2_entry(void *arg)
|
||||
{
|
||||
while (1) {
|
||||
uart_send_string("task2\r\n");
|
||||
tos_task_delay(3000);
|
||||
}
|
||||
}
|
||||
|
||||
k_task_t task1;
|
||||
k_stack_t task1_stack[128];
|
||||
|
||||
k_task_t task2;
|
||||
k_stack_t task2_stack[128];
|
||||
|
||||
#define APPLICATION_TASK_STK_SIZE 256
|
||||
|
||||
k_task_t task_app;
|
||||
k_stack_t task_app_stack[128];
|
||||
|
||||
void application_entry(void * arg)
|
||||
{
|
||||
tos_task_create(&task1, "task1", task1_entry, NULL,
|
||||
4,
|
||||
task1_stack, sizeof(task1_stack),
|
||||
0);
|
||||
|
||||
tos_task_create(&task2, "task2", task2_entry, NULL,
|
||||
4,
|
||||
task2_stack, sizeof(task2_stack),
|
||||
0);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
uart_init(9600);
|
||||
timer1();
|
||||
|
||||
uart_send_string("welcome to TencentOS tiny!\r\n");
|
||||
printf("welcome to TencentOS tiny!\r\n");
|
||||
|
||||
tos_knl_init();
|
||||
|
||||
tos_task_create(&task_app, "app", application_entry, NULL,
|
||||
4,
|
||||
task_app_stack, sizeof(task_app_stack),
|
||||
0);
|
||||
|
||||
tos_knl_start();
|
||||
|
||||
while (1);
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#ifndef __TIM_H_
|
||||
#define __TIM_H_
|
||||
|
||||
void Timer2_Init(uint32_t clock, uint32_t tick_per_second);
|
||||
void timer1(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -5,11 +5,13 @@
|
||||
|
||||
const uint8_t HEX_TABLE[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
|
||||
|
||||
int putchar(int c) {
|
||||
int putchar(int c)
|
||||
{
|
||||
if('\n' == (char)c) {
|
||||
USART_SendData8(USART1, '\r');
|
||||
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
|
||||
}
|
||||
|
||||
USART_SendData8(USART1, c);
|
||||
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
|
||||
return (c);
|
||||
@@ -17,95 +19,90 @@ int putchar(int c) {
|
||||
|
||||
void UART1_Send_Byte(uint8_t ucData)
|
||||
{
|
||||
USART_SendData8(USART1, ucData);
|
||||
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == 0)
|
||||
;
|
||||
USART_SendData8(USART1, ucData);
|
||||
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == 0)
|
||||
;
|
||||
}
|
||||
|
||||
//send string
|
||||
/* send string */
|
||||
void UART1_Send_String(char *Str)
|
||||
{
|
||||
|
||||
while (*Str != '\0') // "\0" meaning is the end of a string
|
||||
{
|
||||
UART1_Send_Byte(*Str);
|
||||
Str++;
|
||||
}
|
||||
while (*Str != '\0') { // "\0" meaning is the end of a string
|
||||
UART1_Send_Byte(*Str);
|
||||
Str++;
|
||||
}
|
||||
}
|
||||
|
||||
void UART1_Send_Dec(unsigned int num, unsigned char ucNumCount)
|
||||
{
|
||||
char disp_buffer1[2];
|
||||
char disp_buffer2[3];
|
||||
char disp_buffer3[4];
|
||||
char disp_buffer4[5];
|
||||
char disp_buffer5[6];
|
||||
char disp_buffer6[7];
|
||||
char disp_buffer1[2];
|
||||
char disp_buffer2[3];
|
||||
char disp_buffer3[4];
|
||||
char disp_buffer4[5];
|
||||
char disp_buffer5[6];
|
||||
char disp_buffer6[7];
|
||||
|
||||
switch (ucNumCount)
|
||||
{
|
||||
case 1:
|
||||
switch (ucNumCount)
|
||||
{
|
||||
case 1:
|
||||
disp_buffer1[0] = HEX_TABLE[num % 10];
|
||||
disp_buffer1[1] = 0;
|
||||
|
||||
disp_buffer1[0] = HEX_TABLE[num % 10];
|
||||
disp_buffer1[1] = 0;
|
||||
UART1_Send_String(disp_buffer1);
|
||||
break;
|
||||
|
||||
UART1_Send_String(disp_buffer1);
|
||||
break;
|
||||
case 2:
|
||||
disp_buffer2[0] = HEX_TABLE[(num % 100) / 10];
|
||||
disp_buffer2[1] = HEX_TABLE[num % 10];
|
||||
disp_buffer2[2] = 0;
|
||||
UART1_Send_String(disp_buffer2);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
disp_buffer2[0] = HEX_TABLE[(num % 100) / 10];
|
||||
disp_buffer2[1] = HEX_TABLE[num % 10];
|
||||
disp_buffer2[2] = 0;
|
||||
UART1_Send_String(disp_buffer2);
|
||||
break;
|
||||
case 3:
|
||||
disp_buffer3[0] = HEX_TABLE[num / 100];
|
||||
disp_buffer3[1] = HEX_TABLE[(num % 100) / 10];
|
||||
disp_buffer3[2] = HEX_TABLE[num % 10];
|
||||
disp_buffer3[3] = 0;
|
||||
case 3:
|
||||
disp_buffer3[0] = HEX_TABLE[num / 100];
|
||||
disp_buffer3[1] = HEX_TABLE[(num % 100) / 10];
|
||||
disp_buffer3[2] = HEX_TABLE[num % 10];
|
||||
disp_buffer3[3] = 0;
|
||||
|
||||
UART1_Send_String(disp_buffer3);
|
||||
break;
|
||||
UART1_Send_String(disp_buffer3);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
disp_buffer4[0] = HEX_TABLE[(num % 10000) / 1000];
|
||||
disp_buffer4[1] = HEX_TABLE[(num % 1000) / 100];
|
||||
disp_buffer4[2] = HEX_TABLE[(num % 100) / 10];
|
||||
disp_buffer4[3] = HEX_TABLE[num % 10];
|
||||
disp_buffer4[4] = 0;
|
||||
case 4:
|
||||
disp_buffer4[0] = HEX_TABLE[(num % 10000) / 1000];
|
||||
disp_buffer4[1] = HEX_TABLE[(num % 1000) / 100];
|
||||
disp_buffer4[2] = HEX_TABLE[(num % 100) / 10];
|
||||
disp_buffer4[3] = HEX_TABLE[num % 10];
|
||||
disp_buffer4[4] = 0;
|
||||
|
||||
UART1_Send_String(disp_buffer4);
|
||||
break;
|
||||
UART1_Send_String(disp_buffer4);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
case 5:
|
||||
disp_buffer5[0] = HEX_TABLE[(num % 100000) / 10000];
|
||||
disp_buffer5[1] = HEX_TABLE[(num % 10000) / 1000];
|
||||
disp_buffer5[2] = HEX_TABLE[(num % 1000) / 100];
|
||||
disp_buffer5[3] = HEX_TABLE[(num % 100) / 10];
|
||||
disp_buffer5[4] = HEX_TABLE[num % 10];
|
||||
disp_buffer5[5] = 0;
|
||||
|
||||
disp_buffer5[0] = HEX_TABLE[(num % 100000) / 10000];
|
||||
disp_buffer5[1] = HEX_TABLE[(num % 10000) / 1000];
|
||||
disp_buffer5[2] = HEX_TABLE[(num % 1000) / 100];
|
||||
disp_buffer5[3] = HEX_TABLE[(num % 100) / 10];
|
||||
disp_buffer5[4] = HEX_TABLE[num % 10];
|
||||
disp_buffer5[5] = 0;
|
||||
UART1_Send_String(disp_buffer5);
|
||||
break;
|
||||
|
||||
UART1_Send_String(disp_buffer5);
|
||||
break;
|
||||
case 6:
|
||||
disp_buffer6[0] = HEX_TABLE[num / 100000];
|
||||
disp_buffer6[1] = HEX_TABLE[(num % 100000) / 10000];
|
||||
disp_buffer6[2] = HEX_TABLE[(num % 10000) / 1000];
|
||||
disp_buffer6[3] = HEX_TABLE[(num % 1000) / 100];
|
||||
disp_buffer6[4] = HEX_TABLE[(num % 100) / 10];
|
||||
disp_buffer6[5] = HEX_TABLE[num % 10];
|
||||
disp_buffer6[6] = 0;
|
||||
|
||||
case 6:
|
||||
UART1_Send_String(disp_buffer6);
|
||||
break;
|
||||
|
||||
disp_buffer6[0] = HEX_TABLE[num / 100000];
|
||||
disp_buffer6[1] = HEX_TABLE[(num % 100000) / 10000];
|
||||
disp_buffer6[2] = HEX_TABLE[(num % 10000) / 1000];
|
||||
disp_buffer6[3] = HEX_TABLE[(num % 1000) / 100];
|
||||
disp_buffer6[4] = HEX_TABLE[(num % 100) / 10];
|
||||
disp_buffer6[5] = HEX_TABLE[num % 10];
|
||||
disp_buffer6[6] = 0;
|
||||
|
||||
UART1_Send_String(disp_buffer6);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UART1_Init(uint32_t uiBaudRate)
|
||||
@@ -128,3 +125,4 @@ void UART1_Init(uint32_t uiBaudRate)
|
||||
// enable UART1
|
||||
USART_Cmd(USART1, ENABLE);
|
||||
}
|
||||
|
||||
|
@@ -259,7 +259,7 @@
|
||||
<name>CCIncludePath2</name>
|
||||
<state>$PROJ_DIR$\..\..\..\..\kernel\core\include</state>
|
||||
<state>$PROJ_DIR$\..\..\..\..\arch\stm8\common\include</state>
|
||||
<state>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm</state>
|
||||
<state>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8</state>
|
||||
<state>$PROJ_DIR$\..\..\BSP\include</state>
|
||||
<state>$PROJ_DIR$\..\..\LIB\inc</state>
|
||||
<state>$PROJ_DIR$\..\..\TOS-CONFIG</state>
|
||||
@@ -1646,16 +1646,16 @@
|
||||
<group>
|
||||
<name>arch</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port.h</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_c.c</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_c.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_config.h</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_config.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_s.S</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_s.S</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\common\tos_cpu.c</name>
|
||||
|
@@ -2160,16 +2160,16 @@
|
||||
<group>
|
||||
<name>arch</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port.h</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_c.c</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_c.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_config.h</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_config.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_s.S</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_s.S</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\common\tos_cpu.c</name>
|
||||
|
@@ -259,7 +259,7 @@
|
||||
<name>CCIncludePath2</name>
|
||||
<state>$PROJ_DIR$\..\..\..\..\kernel\core\include</state>
|
||||
<state>$PROJ_DIR$\..\..\..\..\arch\stm8\common\include</state>
|
||||
<state>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm</state>
|
||||
<state>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8</state>
|
||||
<state>$PROJ_DIR$\..\..\BSP\include</state>
|
||||
<state>$PROJ_DIR$\..\..\LIB\inc</state>
|
||||
<state>$PROJ_DIR$\..\..\TOS-CONFIG</state>
|
||||
@@ -1648,16 +1648,16 @@
|
||||
<group>
|
||||
<name>arch</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port.h</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_c.c</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_c.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_config.h</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_config.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_s.S</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_s.S</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\common\tos_cpu.c</name>
|
||||
|
@@ -2160,16 +2160,16 @@
|
||||
<group>
|
||||
<name>arch</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port.h</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_c.c</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_c.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_config.h</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_config.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccarm\port_s.S</name>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\iccstm8\port_s.S</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\..\..\..\arch\stm8\common\tos_cpu.c</name>
|
||||
|
@@ -112,7 +112,7 @@
|
||||
#define __NAKED__
|
||||
#define __WEAK__ __weak
|
||||
|
||||
/*------------------ ICC Compiler for STM8 ----------------------*/
|
||||
/*------------------ ICC Compiler for STM8/AVR ----------------------*/
|
||||
#elif defined(__IAR_SYSTEMS_ICC__)
|
||||
|
||||
#define __ASM__ __asm
|
||||
|
@@ -26,10 +26,10 @@
|
||||
#define TOS_MACRO_BEGIN do {
|
||||
#define TOS_MACRO_END } while (0)
|
||||
|
||||
#define TOS_OFFSET_OF_FIELD(type, field) \
|
||||
#define TOS_OFFSET_OF_FIELD(type, field) \
|
||||
((uint32_t)&(((type *)0)->field))
|
||||
|
||||
#define TOS_CONTAINER_OF_FIELD(ptr, type, field) \
|
||||
#define TOS_CONTAINER_OF_FIELD(ptr, type, field) \
|
||||
((type *)((uint8_t *)(ptr) - TOS_OFFSET_OF_FIELD(type, field)))
|
||||
|
||||
#define TOS_COUNT_OF(array) (sizeof(array) / sizeof(array[0]))
|
||||
@@ -43,14 +43,14 @@ TOS_MACRO_END
|
||||
|
||||
#define TOS_PTR_SANITY_CHECK_RC(ptr, return_code) \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (unlikely(!(ptr))) { \
|
||||
return return_code; \
|
||||
if (unlikely(!(ptr))) { \
|
||||
return return_code; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
|
||||
#define TOS_IN_IRQ_CHECK() \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (unlikely(knl_is_inirq())) { \
|
||||
if (unlikely(knl_is_inirq())) { \
|
||||
return K_ERR_IN_IRQ; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
@@ -60,9 +60,9 @@ TOS_MACRO_END
|
||||
#define TOS_OBJ_INIT(obj, obj_type) knl_object_init(&obj->knl_obj, obj_type)
|
||||
#define TOS_OBJ_DEINIT(obj) knl_object_deinit(&obj->knl_obj)
|
||||
|
||||
#define TOS_OBJ_VERIFY(obj, obj_type) \
|
||||
#define TOS_OBJ_VERIFY(obj, obj_type) \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (!knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
if (!knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
return K_ERR_OBJ_INVALID; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
@@ -70,7 +70,22 @@ TOS_MACRO_END
|
||||
|
||||
#define TOS_OBJ_VERIFY_RC(obj, obj_type, return_code) \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (!knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
if (!knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
return return_code; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
|
||||
#define TOS_OBJ_TEST(obj, obj_type) \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
return K_ERR_OBJ_INVALID; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
|
||||
|
||||
#define TOS_OBJ_TEST_RC(obj, obj_type, return_code) \
|
||||
TOS_MACRO_BEGIN \
|
||||
if (knl_object_verify(&obj->knl_obj, obj_type)) { \
|
||||
return return_code; \
|
||||
} \
|
||||
TOS_MACRO_END
|
||||
@@ -81,6 +96,8 @@ TOS_MACRO_END
|
||||
#define TOS_OBJ_DEINIT(obj)
|
||||
#define TOS_OBJ_VERIFY(obj, obj_type)
|
||||
#define TOS_OBJ_VERIFY_RC(obj, obj_type, return_code)
|
||||
#define TOS_OBJ_TEST(obj, obj_type)
|
||||
#define TOS_OBJ_TEST_RC(obj, obj_type, return_code)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -93,18 +110,18 @@ TOS_MACRO_END
|
||||
// currently we use default microlib supplied by mdk
|
||||
#define tos_kprintf(...) LIBC_PRINTF(__VA_ARGS__);
|
||||
|
||||
#define tos_kprintln(...) \
|
||||
LIBC_PRINTF(__VA_ARGS__); \
|
||||
#define tos_kprintln(...) \
|
||||
LIBC_PRINTF(__VA_ARGS__); \
|
||||
LIBC_PRINTF("\n");
|
||||
|
||||
#define TOS_ASSERT_AUX(exp, function, line) \
|
||||
if (!(exp)) { \
|
||||
tos_kprintln("assert failed: %s %d\n", function, line); \
|
||||
tos_knl_sched_lock(); \
|
||||
tos_cpu_int_disable(); \
|
||||
while (K_TRUE) { \
|
||||
; \
|
||||
} \
|
||||
#define TOS_ASSERT_AUX(exp, function, line) \
|
||||
if (!(exp)) { \
|
||||
tos_kprintln("assert failed: %s %d\n", function, line); \
|
||||
tos_knl_sched_lock(); \
|
||||
tos_cpu_int_disable(); \
|
||||
while (K_TRUE) { \
|
||||
; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define TOS_ASSERT(exp) TOS_ASSERT_AUX(exp, __FUNCTION__, __LINE__)
|
||||
|
@@ -21,10 +21,10 @@
|
||||
__CDECLS_BEGIN
|
||||
|
||||
#define K_PRIO_TBL_SIZE ((TOS_CFG_TASK_PRIO_MAX + 31) / 32)
|
||||
#define K_PRIO_TBL_SLOT_SIZE (32u)
|
||||
#define K_PRIO_TBL_SLOT_SIZE (8 * sizeof(uint32_t))
|
||||
|
||||
#define K_PRIO_NDX(prio) ((prio) >> 5u) /* prio / 32u */
|
||||
#define K_PRIO_BIT(prio) ((uint32_t)1u << (K_PRIO_TBL_SLOT_SIZE - 1u - ((prio) & (K_PRIO_TBL_SLOT_SIZE - 1u))))
|
||||
#define K_PRIO_NDX(prio) ((prio) >> 5u) /* prio / 32u */
|
||||
#define K_PRIO_BIT(prio) ((uint32_t)1u << (K_PRIO_TBL_SLOT_SIZE - 1u - ((prio) & (K_PRIO_TBL_SLOT_SIZE - 1u))))
|
||||
|
||||
typedef struct readyqueue_st {
|
||||
k_list_t task_list_head[TOS_CFG_TASK_PRIO_MAX];
|
||||
|
@@ -189,7 +189,7 @@ __API__ k_err_t tos_rwlock_wpend_timed(k_rwlock_t *rwlock, k_tick_t timeout)
|
||||
}
|
||||
|
||||
while (rwlock->n_readers > 0u || rwlock->is_writting) {
|
||||
/* util no one is writting or reading */
|
||||
/* until no one is writting or reading */
|
||||
err = tos_sem_pend(&rwlock->signal, timeout);
|
||||
if (err != K_ERR_NONE) {
|
||||
break;
|
||||
|
@@ -96,10 +96,8 @@ __API__ k_err_t tos_task_create(k_task_t *task,
|
||||
TOS_PTR_SANITY_CHECK(entry);
|
||||
TOS_PTR_SANITY_CHECK(stk_base);
|
||||
|
||||
if (task->knl_obj.type == KNL_OBJ_TYPE_TASK) {
|
||||
/* try to re-create a task, kind of dangerous action */
|
||||
return K_ERR_TASK_ALREADY_CREATED;
|
||||
}
|
||||
/* try to re-create a task, kind of dangerous */
|
||||
TOS_OBJ_TEST_RC(task, KNL_OBJ_TYPE_TASK, K_ERR_TASK_ALREADY_CREATED);
|
||||
|
||||
if (unlikely(stk_size < K_TASK_STK_SIZE_MIN)) {
|
||||
return K_ERR_TASK_STK_SIZE_INVALID;
|
||||
|
@@ -88,20 +88,20 @@ __STATIC__ k_time_t tickless_cpu_sleep_time_get(k_cpu_lpwr_mode_t lpwr_mode)
|
||||
return time_sleep_ms > max_delay_ms ? max_delay_ms : time_sleep_ms;
|
||||
}
|
||||
|
||||
__STATIC__ void tickless_systick_suspend(void)
|
||||
__STATIC__ void tickless_tick_suspend(void)
|
||||
{
|
||||
cpu_systick_suspend();
|
||||
cpu_systick_pending_reset();
|
||||
}
|
||||
|
||||
__STATIC__ void tickless_systick_resume(void)
|
||||
__STATIC__ void tickless_tick_resume(void)
|
||||
{
|
||||
cpu_systick_suspend();
|
||||
cpu_systick_reset();
|
||||
cpu_systick_resume();
|
||||
}
|
||||
|
||||
__STATIC__ void tickless_systick_fix(k_tick_t tick_sleep)
|
||||
__STATIC__ void tickless_tick_fix(k_tick_t tick_sleep)
|
||||
{
|
||||
TOS_CPU_CPSR_ALLOC();
|
||||
|
||||
@@ -114,14 +114,14 @@ __STATIC__ void tickless_systick_fix(k_tick_t tick_sleep)
|
||||
timer_update();
|
||||
#endif
|
||||
|
||||
tickless_systick_resume();
|
||||
tickless_tick_resume();
|
||||
|
||||
TOS_CPU_INT_ENABLE();
|
||||
}
|
||||
|
||||
__STATIC__ void tickless_enter(void)
|
||||
{
|
||||
tickless_systick_suspend();
|
||||
tickless_tick_suspend();
|
||||
}
|
||||
|
||||
__STATIC__ void tickless_leave(k_time_t time_sleep_ms)
|
||||
@@ -131,7 +131,7 @@ __STATIC__ void tickless_leave(k_time_t time_sleep_ms)
|
||||
/* how many "ticks" have we sleep */
|
||||
tick_sleep = k_cpu_tick_per_second * time_sleep_ms / K_TIME_MILLISEC_PER_SEC;
|
||||
|
||||
tickless_systick_fix(tick_sleep);
|
||||
tickless_tick_fix(tick_sleep);
|
||||
}
|
||||
|
||||
__KNL__ void tickless_proc(void)
|
||||
|
@@ -1,119 +1,119 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* 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 _POSIX_PRIVATE_PTHREAD_H_
|
||||
#define _POSIX_PRIVATE_PTHREAD_H_
|
||||
|
||||
#include "tos_k.h"
|
||||
|
||||
#include "private/posix_config.h"
|
||||
|
||||
#include "sys/types.h"
|
||||
|
||||
__CDECLS_BEGIN
|
||||
|
||||
typedef struct pthread_control_st {
|
||||
uint16_t threadstate : 4;
|
||||
uint16_t cancelstate : 2;
|
||||
uint16_t canceltype : 2;
|
||||
uint16_t cancelpending : 1;
|
||||
|
||||
pthread_t id;
|
||||
pthread_attr_t attr;
|
||||
k_task_t ktask;
|
||||
k_task_t *the_ktask;
|
||||
|
||||
k_sem_t joinner_sem;
|
||||
|
||||
void *(*start_routine)(void *); /* start routine of the pthread */
|
||||
void *arg; /* argument to start routine */
|
||||
void *retval; /* return value of start routine */
|
||||
void *stackaddr; /* memory of address */
|
||||
|
||||
k_slist_t cleanup_ctl_list;
|
||||
|
||||
void **thread_data;
|
||||
} pthread_ctl_t;
|
||||
|
||||
typedef struct pthread_cleanup_control_st {
|
||||
void (*routine)(void *); /* function to be called */
|
||||
void *arg; /* argument for the routine */
|
||||
k_slist_t list;
|
||||
} pthread_cleanup_ctl_t;
|
||||
|
||||
#define PTHREAD_KEYS_MAX (POSIX_CFG_PTHREAD_KEYS_MAX)
|
||||
|
||||
typedef void (*key_destructor_t)(void*);
|
||||
|
||||
typedef struct pthread_key_control_st {
|
||||
k_bmtbl_t key_bitmap_tbl[TOS_BITMAP_SIZE(PTHREAD_KEYS_MAX)];
|
||||
k_bitmap_t key_bitmap;
|
||||
key_destructor_t destructors[PTHREAD_KEYS_MAX];
|
||||
} pthread_key_ctl_t;
|
||||
|
||||
#define PTHREAD_INFO_SIZE (sizeof(pthread_ctl_t))
|
||||
#define PTHREAD_STK_SIZE_MIN (K_TASK_STK_SIZE_MIN + PTHREAD_INFO_SIZE)
|
||||
|
||||
#define PTHREAD_DEFAULT_TIMESLICE 20
|
||||
#define PTHREAD_DEFAULT_STACKSIZE (2048 + PTHREAD_INFO_SIZE)
|
||||
#define PTHREAD_DEFAULT_INHERIT_SCHED PTHREAD_INHERIT_SCHED
|
||||
#define PTHREAD_DEFAULT_SCHEDPOLICY SCHED_OTHER
|
||||
#define PTHREAD_DEFAULT_PRIORITY (TOS_CFG_TASK_PRIO_MAX / 2)
|
||||
#define PTHREAD_DEFAULT_DETACH_STATE PTHREAD_CREATE_JOINABLE
|
||||
|
||||
#define PTHREAD_DESTRUCTOR_ITERATIONS (POSIX_CFG_PTHREAD_DESTRUCTOR_ITERATIONS)
|
||||
|
||||
#define PTHREAD_THREADS_MAX (POSIX_CFG_PTHREAD_THREADS_MAX)
|
||||
|
||||
__KNL__
|
||||
pthread_ctl_t *pthread_ctl_self(void);
|
||||
|
||||
__KNL__ pthread_ctl_t *pthread_ctl_by_id(pthread_t id);
|
||||
|
||||
__KNL__ int pthread_id_add(pthread_t id, pthread_ctl_t *info);
|
||||
|
||||
__KNL__ pthread_t pthread_id_alloc(void);
|
||||
|
||||
__KNL__ int pthread_id_free(pthread_t id);
|
||||
|
||||
__KNL__ void pthread_data_clear(pthread_key_t key);
|
||||
|
||||
__KNL__ int pthread_key_ctl_init(void);
|
||||
|
||||
__KNL__ pthread_key_t pthread_key_alloc(void);
|
||||
|
||||
__KNL__ int pthread_key_is_alloc(pthread_key_t key);
|
||||
|
||||
__KNL__ int pthread_key_free(pthread_key_t key);
|
||||
|
||||
__KNL__ int pthread_key_destructor_register(pthread_key_t key, key_destructor_t destructor);
|
||||
|
||||
__KNL__ key_destructor_t pthread_key_destructor_get(pthread_key_t key);
|
||||
|
||||
__KNL__ int pthread_ctl_reap(int pthreads_ready2reap);
|
||||
|
||||
__KNL__ void pthread_lock(void);
|
||||
|
||||
__KNL__ void pthread_unlock(void);
|
||||
|
||||
__KNL__ int pthread_lock_init(void);
|
||||
|
||||
__KNL__ int pthread_init(void);
|
||||
|
||||
__CDECLS_END
|
||||
|
||||
#endif /* _POSIX_PRIVATE_PTHREAD_PRV_H_ */
|
||||
/*----------------------------------------------------------------------------
|
||||
* 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 _POSIX_PRIVATE_PTHREAD_H_
|
||||
#define _POSIX_PRIVATE_PTHREAD_H_
|
||||
|
||||
#include "tos_k.h"
|
||||
|
||||
#include "private/posix_config.h"
|
||||
|
||||
#include "sys/types.h"
|
||||
|
||||
__CDECLS_BEGIN
|
||||
|
||||
typedef struct pthread_control_st {
|
||||
uint16_t threadstate : 4;
|
||||
uint16_t cancelstate : 2;
|
||||
uint16_t canceltype : 2;
|
||||
uint16_t cancelpending : 1;
|
||||
|
||||
pthread_t id;
|
||||
pthread_attr_t attr;
|
||||
k_task_t ktask;
|
||||
k_task_t *the_ktask;
|
||||
|
||||
k_sem_t joinner_sem;
|
||||
|
||||
void *(*start_routine)(void *); /* start routine of the pthread */
|
||||
void *arg; /* argument for start routine */
|
||||
void *retval; /* return value of start routine */
|
||||
void *stackaddr; /* memory address of stack */
|
||||
|
||||
k_slist_t cleanup_ctl_list;
|
||||
|
||||
void **thread_data;
|
||||
} pthread_ctl_t;
|
||||
|
||||
typedef struct pthread_cleanup_control_st {
|
||||
void (*routine)(void *); /* function to be called */
|
||||
void *arg; /* argument for the routine */
|
||||
k_slist_t list;
|
||||
} pthread_cleanup_ctl_t;
|
||||
|
||||
#define PTHREAD_KEYS_MAX (POSIX_CFG_PTHREAD_KEYS_MAX)
|
||||
|
||||
typedef void (*key_destructor_t)(void*);
|
||||
|
||||
typedef struct pthread_key_control_st {
|
||||
k_bmtbl_t key_bitmap_tbl[TOS_BITMAP_SIZE(PTHREAD_KEYS_MAX)];
|
||||
k_bitmap_t key_bitmap;
|
||||
key_destructor_t destructors[PTHREAD_KEYS_MAX];
|
||||
} pthread_key_ctl_t;
|
||||
|
||||
#define PTHREAD_INFO_SIZE (sizeof(pthread_ctl_t))
|
||||
#define PTHREAD_STK_SIZE_MIN (K_TASK_STK_SIZE_MIN + PTHREAD_INFO_SIZE)
|
||||
|
||||
#define PTHREAD_DEFAULT_TIMESLICE 20
|
||||
#define PTHREAD_DEFAULT_STACKSIZE (2048 + PTHREAD_INFO_SIZE)
|
||||
#define PTHREAD_DEFAULT_INHERIT_SCHED PTHREAD_INHERIT_SCHED
|
||||
#define PTHREAD_DEFAULT_SCHEDPOLICY SCHED_OTHER
|
||||
#define PTHREAD_DEFAULT_PRIORITY (TOS_CFG_TASK_PRIO_MAX / 2)
|
||||
#define PTHREAD_DEFAULT_DETACH_STATE PTHREAD_CREATE_JOINABLE
|
||||
|
||||
#define PTHREAD_DESTRUCTOR_ITERATIONS (POSIX_CFG_PTHREAD_DESTRUCTOR_ITERATIONS)
|
||||
|
||||
#define PTHREAD_THREADS_MAX (POSIX_CFG_PTHREAD_THREADS_MAX)
|
||||
|
||||
__KNL__ pthread_ctl_t *pthread_ctl_self(void);
|
||||
|
||||
__KNL__ pthread_ctl_t *pthread_ctl_by_id(pthread_t id);
|
||||
|
||||
__KNL__ int pthread_id_add(pthread_t id, pthread_ctl_t *info);
|
||||
|
||||
__KNL__ pthread_t pthread_id_alloc(void);
|
||||
|
||||
__KNL__ int pthread_id_free(pthread_t id);
|
||||
|
||||
__KNL__ void pthread_data_clear(pthread_key_t key);
|
||||
|
||||
__KNL__ int pthread_key_ctl_init(void);
|
||||
|
||||
__KNL__ pthread_key_t pthread_key_alloc(void);
|
||||
|
||||
__KNL__ int pthread_key_is_alloc(pthread_key_t key);
|
||||
|
||||
__KNL__ int pthread_key_free(pthread_key_t key);
|
||||
|
||||
__KNL__ int pthread_key_destructor_register(pthread_key_t key, key_destructor_t destructor);
|
||||
|
||||
__KNL__ key_destructor_t pthread_key_destructor_get(pthread_key_t key);
|
||||
|
||||
__KNL__ int pthread_ctl_reap(int pthreads_ready2reap);
|
||||
|
||||
__KNL__ void pthread_lock(void);
|
||||
|
||||
__KNL__ void pthread_unlock(void);
|
||||
|
||||
__KNL__ int pthread_lock_init(void);
|
||||
|
||||
__KNL__ int pthread_init(void);
|
||||
|
||||
__CDECLS_END
|
||||
|
||||
#endif /* _POSIX_PRIVATE_PTHREAD_PRV_H_ */
|
||||
|
||||
|
@@ -95,4 +95,3 @@ __KNL__ mqueue_ctl_t *mqueue_by_id(mqd_t id)
|
||||
return the_ctl;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -212,7 +212,7 @@ __API__ int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_
|
||||
return 0;
|
||||
}
|
||||
|
||||
__API__ int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
|
||||
__API__ int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
|
||||
{
|
||||
TOS_PTR_SANITY_CHECK_RC(attr, EINVAL);
|
||||
TOS_PTR_SANITY_CHECK_RC(policy, EINVAL);
|
||||
|
Reference in New Issue
Block a user