agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
arch.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_ARCH_H
8 #define ZRTOS_ARCH_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <zrtos/types.h>
15 #include <zrtos/assert.h>
16 
17 typedef void (*zrtos_arch_callback_t)(void *arg);
18 
19 /*
20 typedef uint8_t zrtos_arch_stack_t;
21 typedef int8_t zrtos_arch_stack_signed_t;
22 typedef int zrtos_arch_gpio_pin_t;
23 typedef int zrtos_arch_gpio_value_analog_t;
24 #define ZRTOS_ARCH__BYTE_ORDER
25 #define ZRTOS_ARCH__FOUND
26 #define ZRTOS_ARCH__CPU_CLOCK_HZ
27 #define ZRTOS_ARCH__BYTE_ALIGNMENT
28 #define ZRTOS_ARCH__FATAL()
29 #define ZRTOS_ARCH__SET_STACK_PTR(sp)
30 #define ZRTOS_ARCH__GET_STACK_PTR()
31 #define ZRTOS_ARCH__IS_INTERRUPTS_DISABLED()
32 #define ZRTOS_ARCH__IS_INTERRUPTS_ENABLED()
33 #define ZRTOS_ARCH__DISABLE_INTERRUPTS()
34 #define ZRTOS_ARCH__ENABLE_INTERRUPTS()
35 zrtos_arch_stack_t *zrtos_arch__cpu_state_init(
36  zrtos_arch_stack_t *thiz
37  //,size_t length
38  ,zrtos_arch_callback_t callback
39  ,void *args
40 )
41 #define ZRTOS_ARCH__GET_CPU_STATE_BUFFER_LENGTH()
42 #define ZRTOS_ARCH__GET_FN_CALL_STACK_LENGTH()
43 #define ZRTOS_ARCH__SAVE_CPU_STATE(ptr)
44 #define ZRTOS_ARCH__LOAD_CPU_STATE(ptr)
45 #define ZRTOS_ARCH__RETURN_FROM_INTERRUPT()
46 void zrtos_arch__delay_microseconds(uint16_t us);
47 void zrtos_arch__delay_milliseconds(uint16_t ms);
48 */
49 
50 #ifdef ZRTOS_ARCH__FOUND
51 #error "ZRTOS_ARCH__FOUND defined"
52 #endif
53 
54 #define ZRTOS_ARCH__BYTE_ORDER_LITTLE_ENDIAN 1234
55 #define ZRTOS_ARCH__BYTE_ORDER_BIG_ENDIAN 4321
56 #define ZRTOS_ARCH__BYTE_ORDER_PDP_ENDIAN 3412
57 
58 #include <zrtos/arch/atmega328p.h>
59 #include <zrtos/arch/atmega2560.h>
60 
61 #ifndef ZRTOS_ARCH__FOUND
62 #error "arch/*.h not found"
63 #endif
64 
65 #if ZRTOS_ARCH__BYTE_ALIGNMENT == 32
66  #define ZRTOS_ARCH__BYTE_ALIGNMENT_MASK ( 0x001f )
67 #elif ZRTOS_ARCH__BYTE_ALIGNMENT == 16
68  #define ZRTOS_ARCH__BYTE_ALIGNMENT_MASK ( 0x000f )
69 #elif ZRTOS_ARCH__BYTE_ALIGNMENT == 8
70  #define ZRTOS_ARCH__BYTE_ALIGNMENT_MASK ( 0x0007 )
71 #elif ZRTOS_ARCH__BYTE_ALIGNMENT == 4
72  #define ZRTOS_ARCH__BYTE_ALIGNMENT_MASK ( 0x0003 )
73 #elif ZRTOS_ARCH__BYTE_ALIGNMENT == 2
74  #define ZRTOS_ARCH__BYTE_ALIGNMENT_MASK ( 0x0001 )
75 #elif ZRTOS_ARCH__BYTE_ALIGNMENT == 1
76  #define ZRTOS_ARCH__BYTE_ALIGNMENT_MASK ( 0x0000 )
77 #else
78  #error "Invalid ZRTOS_ARCH__BYTE_ALIGNMENT definition"
79 #endif
80 
81 ///@todo verify alignment
82 /*
83 ZRTOS_ASSERT__STATIC(
84  ZRTOS_ARCH__BYTE_ALIGNMENT == ZRTOS_TYPES__BYTE_ALIGNMENT
85 );
86 ZRTOS_ASSERT__STATIC(
87  ZRTOS_ARCH__BYTE_ALIGNMENT_MASK != ZRTOS_TYPES__BYTE_ALIGNMENT_MASK
88 );
89 */
90 
92 #define ZRTOS_ARCH__DO_NOT_DISTURB(code) \
93  do{ \
94  ZRTOS_ARCH__DISABLE_INTERRUPTS(); \
95  zrtos_arch__do_not_disturb++; \
96  do{ \
97  code; \
98  }while(0); \
99  if(--zrtos_arch__do_not_disturb == 0){ \
100  ZRTOS_ARCH__ENABLE_INTERRUPTS(); \
101  } \
102  }while(0);
103 
104 
105 #define ZRTOS_ARCH__DO_NOT_DISTURB_EX(is_locked,code) \
106  do{ \
107  is_locked = ZRTOS_ARCH__IS_INTERRUPTS_DISABLED(); \
108  ZRTOS_ARCH__DISABLE_INTERRUPTS(); \
109  zrtos_arch__do_not_disturb++; \
110  do{ \
111  code; \
112  }while(0); \
113  if(--zrtos_arch__do_not_disturb == 0){ \
114  ZRTOS_ARCH__ENABLE_INTERRUPTS(); \
115  } \
116  }while(0);
117 
118 #ifdef __cplusplus
119 }
120 #endif
121 #endif
void(* zrtos_arch_callback_t)(void *arg)
Definition: arch.h:17
size_t zrtos_arch__do_not_disturb
Definition: arch.h:91