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:
daishengdong
2020-03-03 18:27:24 +08:00
parent e3da94194e
commit 7e6ce005e6
56 changed files with 13225 additions and 244 deletions

View 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

View 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_ */

View 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_ */

View 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

View 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
View 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
View 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
View 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
View 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(&regs);
}
/*------------------ 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 */

View 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_ */

View File

@@ -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

Binary file not shown.

View File

@@ -0,0 +1,7 @@
#ifndef __TIM_H_
#define __TIM_H_
// void Timer2_Init(uint32_t clock, uint32_t tick_per_second);
#endif

View 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

View 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

View 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);
}

View 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);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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>

View File

@@ -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>

View File

@@ -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

View File

@@ -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>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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>

View File

@@ -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

View File

@@ -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"
}

View File

@@ -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"

View File

@@ -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"

View File

@@ -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>

View File

@@ -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

View File

@@ -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

View 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

View 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

View 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);
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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

View File

@@ -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__)

View File

@@ -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];

View File

@@ -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;

View File

@@ -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;

View File

@@ -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)

View File

@@ -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_ */

View File

@@ -95,4 +95,3 @@ __KNL__ mqueue_ctl_t *mqueue_by_id(mqd_t id)
return the_ctl;
}

View File

@@ -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);