ESOS32
ESOSOn32-bitProcessors
esos.h
Go to the documentation of this file.
1 /*
2  * "Copyright (c) 2019 J. W. Bruce ("AUTHOR(S)")"
3  * All rights reserved.
4  * (J. W. Bruce, jwbruce_AT_tntech.edu, Tennessee Tech University)
5  *
6  * Permission to use, copy, modify, and distribute this software and its
7  * documentation for any purpose, without fee, and without written agreement is
8  * hereby granted, provided that the above copyright notice, the following
9  * two paragraphs and the authors appear in all copies of this software.
10  *
11  * IN NO EVENT SHALL THE "AUTHORS" BE LIABLE TO ANY PARTY FOR
12  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
13  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE "AUTHORS"
14  * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15  *
16  * THE "AUTHORS" SPECIFICALLY DISCLAIMS ANY WARRANTIES,
17  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
18  * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
19  * ON AN "AS IS" BASIS, AND THE "AUTHORS" HAS NO OBLIGATION TO
20  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
21  *
22  * Please maintain this header in its entirety when copying/modifying
23  * these files.
24  *
25  *
26  */
27 
28 // Documentation for this file. If the \file tag isn't present,
29 // this file won't be documented.
35 #ifndef ESOS_H
36 #define ESOS_H
37 
38 #ifndef BUILT_ON_ESOS
39 #define BUILT_ON_ESOS
40 #endif
41 
42 // Place this define here because many of the the following INCLUDE files need this macro variable
43 #define MAX_NUM_USER_TASKS 32
44 
45 
46 // Include all the files we need
47 #include "all_generic.h"
48 #include "esos_utils.h"
49 #include "esos_task.h" // defines ESOS tasks and semaphores
50 #include "esos_mail.h" // defines ESOS task mailboxes (eventually make MAILBOXes optional)
51 
52 // PUT THESE HERE FOR NOW. They belong somewhere else
53 // in the long-run.
54 //
55 // PC versions do NOT have IRQs (yet) so do NOT define the variables
56 #if 0
57 // #ifndef __linux
58 #define ESOS_USE_IRQS
59 #endif
60 
61 #define ESOS_USE_SERIAL_PORT
62 
67 #if defined(ESOS_USE_SERIAL_PORT)
68 #include "esos_comm.h"
69 #endif // USE_USB or USE_SERIAL
70 
71 #ifdef ESOS_USE_IRQS
72 /*
73 * user wants IRQ support, so prototype the required IRQ functions
74 */
75 #include "esos_irq.h"
76 #endif //ESOS_USE_IRQS
77 
78 #ifdef ESOS_USE_WATCHDOG
79 /*
80 * user wants to include watchdog timer support
81 */
82 #include "esos_wdog.h"
83 #endif //ESOS_USE_WATCHDOG
84 
85 #ifdef ESOS_USE_SUI
86 /*
87 * user wants to include the simple user inteface service support
88 */
89 #include "esos_sui.h"
90 #endif //ESOS_USE_SUI
91 
92 #ifdef ESOS_USE_LCD
93 /*
94 * user wants to use the LCD interface
95 */
96 #include "esos_lcd44780wo.h"
97 #endif //ESOS_USE_LCD
98 
99 #if defined (ESOS_USE_I2C_100KBPS) || defined (ESOS_USE_I2C) || defined (ESOS_USE_I2C_400KBPS)
100 /*
101 * user wants to use the I2C interface
102 */
103 #include "esos_i2c.h"
104 #endif // ESOS_USE_I2C
105 
106 
107 #if defined (ESOS_USE_SPI)
108 /*
109 * user wants to use the SPI interface
110 */
111 #include "esos_spi.h"
112 #endif // ESOS_USE_SPI
113 
114 
115 #ifdef ESOS_RUNS_ON_REAL_OS
116 // computers running a host OS (windoze/Linux/etc) expect
117 // their applications to return and return a value
118 // so define a return type for main and create a return statement
119 // also, multitasking OS-es will want some CPU time for other
120 // applications, so sleep some (10ms = 10000us) should be enough
121 typedef int main_t;
122 #define OS_END return(1)
123 #define OS_ITERATE usleep(10000)
124 #else
125 // hardware w/o a hosting OS will never return. So main_t
126 // must be void return type and hang-up when done!
127 // (Of course, real hardware apps should never be done.)
128 typedef int main_t;
129 #define OS_END while(1)
130 #define OS_ITERATE
131 #endif
132 
133 //*********************************************************************
134 // P R I V A T E D E F I N I T I O N S
135 //*********************************************************************
149 #define MAX_NUM_CHILD_TASKS MAX_NUM_USER_TASKS
150 #define REMOVE_IDX 0xFE
151 
152 
153 /* S T R U C T U R E S ******************************************************/
159  volatile uint8_t* pau8_Data;
160  int16_t u16_Head;
161  int16_t u16_Tail;
162  uint16_t u16_Length;
163  struct stTask pst_Task;
164 };
165 
171  uint16_t u16_Header;
172  uint32_t u32_Postmark;
173 };
174 
175 struct stTimer {
176  void (*pfn)(void);
177  uint32_t u32_period;
178  uint32_t u32_cntDown;
179 };
180 
181 // Define masks for the user to use for their flags
185 #define ESOS_USER_FLAG_0 ESOS_BIT0
186 
189 #define ESOS_USER_FLAG_1 ESOS_BIT1
190 
193 #define ESOS_USER_FLAG_2 ESOS_BIT2
194 
197 #define ESOS_USER_FLAG_3 ESOS_BIT3
198 
201 #define ESOS_USER_FLAG_4 ESOS_BIT4
202 
205 #define ESOS_USER_FLAG_5 ESOS_BIT5
206 
209 #define ESOS_USER_FLAG_6 ESOS_BIT6
210 
213 #define ESOS_USER_FLAG_7 ESOS_BIT7
214 
217 #define ESOS_USER_FLAG_8 ESOS_BIT8
218 
221 #define ESOS_USER_FLAG_9 ESOS_BIT9
222 
225 #define ESOS_USER_FLAG_10 ESOS_BIT10
226 
229 #define ESOS_USER_FLAG_11 ESOS_BIT11
230 
233 #define ESOS_USER_FLAG_12 ESOS_BIT12
234 
237 #define ESOS_USER_FLAG_13 ESOS_BIT13
238 
241 #define ESOS_USER_FLAG_14 ESOS_BIT14
242 
245 #define ESOS_USER_FLAG_15 ESOS_BIT15
246 
249 #define ESOS_USER_FLAG_16 ESOS_BIT16
250 
253 #define ESOS_USER_FLAG_17 ESOS_BIT17
254 
257 #define ESOS_USER_FLAG_18 ESOS_BIT18
258 
261 #define ESOS_USER_FLAG_19 ESOS_BIT19
262 
265 #define ESOS_USER_FLAG_20 ESOS_BIT20
266 
269 #define ESOS_USER_FLAG_21 ESOS_BIT21
270 
273 #define ESOS_USER_FLAG_22 ESOS_BIT22
274 
277 #define ESOS_USER_FLAG_23 ESOS_BIT23
278 
281 #define ESOS_USER_FLAG_24 ESOS_BIT24
282 
285 #define ESOS_USER_FLAG_25 ESOS_BIT25
286 
289 #define ESOS_USER_FLAG_26 ESOS_BIT26
290 
293 #define ESOS_USER_FLAG_27 ESOS_BIT27
294 
297 #define ESOS_USER_FLAG_28 ESOS_BIT28
298 
301 #define ESOS_USER_FLAG_29 ESOS_BIT29
302 
305 #define ESOS_USER_FLAG_30 ESOS_BIT30
306 
309 #define ESOS_USER_FLAG_31 ESOS_BIT31
310 
311 
324 #define ESOS_USER_TIMER(timername) void timername(void)
325 
337 typedef uint8_t ESOS_TMR_HANDLE;
338 
339 /*
340  * Now define the public user function prototypes that are
341  * always available regardless of the user_config settings
342  */
373 void user_init( void );
374 ESOS_TASK_HANDLE esos_RegisterTask( uint8_t (*pfn_TaskFcn)(struct stTask *pst_Task) );
375 uint8_t esos_UnregisterTask( uint8_t (*pfn_TaskFcn)(struct stTask *pst_Task) ) ;
377 ESOS_TASK_HANDLE esos_GetTaskHandle( uint8_t (*taskname)(ESOS_TASK_HANDLE pstTask) );
378 ESOS_TASK_HANDLE esos_GetTaskHandleFromID( uint16_t u16_TaskID );
379 
380 
381 // prototypes for ESOS software timers
382 ESOS_TMR_HANDLE esos_RegisterTimer( void (*pfnTmrFcn)(void), uint32_t u32_period );
383 uint8_t esos_UnregisterTimer( ESOS_TMR_HANDLE hnd_timer );
384 ESOS_TMR_HANDLE esos_GetTimerHandle( void (*pfnTmrFcn)(void) );
385 uint8_t esos_ChangeTimerPeriod( ESOS_TMR_HANDLE hnd_timer, uint32_t u32_period );
386 
387 /* ********************************************************************
388 * ESOS requires that the hardware-specific code provide certain basic
389 * functions, even for a stripped down ESOS app.
390 * ********************************************************************/
391 
392 // The user must provide the HW-specific way of getting a 32bit 1.0ms tick
393 void __esos_hw_InitSystemTick(void);
394 uint32_t __esos_hw_GetSystemTickCount(void);
395 // pseudo random number generation routines
396 uint32_t __esos_hw_PRNG_u32(void);
397 void __esos_hw_config_PRNG(void);
398 void __esos_hw_set_PRNG_Seed(uint32_t u32_seed);
399 
400 
401 #define __MILLISECONDS_PER_TICK 1
402 #define MILLISECONDS __MILLISECONDS_PER_TICK
403 #define SECONDS MILLISECONDS*1000
404 #define MINUTES SECONDS*60
405 #define HOURS MINUTES*60
406 #define DAYS HOURS*24
407 
418 #define esos_GetSystemTick() __esos_hw_GetSystemTickCount()
419 
420 
421 uint16_t __esos_hasTickDurationPassed(uint32_t u32_startTick, uint32_t u32_period);
422 void __esos_tmrSvcsExecute(void);
423 
424 void __esos_InitCommSystem(void);
425 
426 
427 /*
428  * expose these ESOS system variables to allow macro access
429  * intead of fcn access
430  */
431 extern uint8_t __esos_u8UserTasksRegistered;
432 extern uint32_t __esos_u32UserFlags, __esos_u32SystemFlags;
433 
443 #define esos_GetNumberRegisteredTasks() (__esos_u8UserTasksRegistered)
444 
454 #define esos_GetFutureSystemTick(deltaT) ((uint32_t)(deltaT) + __esos_hw_GetSystemTickCount());
455 
472 #define esos_SetUserFlag(mask) BIT_SET_MASK(__esos_u32UserFlags, (mask))
473 
492 #define esos_ClearUserFlag(mask) BIT_CLEAR_MASK(__esos_u32UserFlags, (mask))
493 
514 #define esos_IsUserFlagSet(mask) IS_BIT_SET_MASK(__esos_u32UserFlags, (mask))
515 
536 #define esos_IsUserFlagClear(mask) IS_BIT_CLEAR_MASK(__esos_u32UserFlags, (mask))
537 
538 // define macros for ESOS system flags
539 // these flags are NOT to be manipulated directly by the user!
540 #define __esos_SetSystemFlag(mask) BIT_SET_MASK(__esos_u32SystemFlags, (mask))
541 #define __esos_ClearSystemFlag(mask) BIT_CLEAR_MASK(__esos_u32SystemFlags, (mask))
542 #define __esos_IsSystemFlagSet(mask) IS_BIT_SET_MASK(__esos_u32SystemFlags, (mask))
543 #define __esos_IsSystemFlagClear(mask) IS_BIT_CLEAR_MASK(__esos_u32SystemFlags, (mask))
544 
545 // Defines for ESOS timer services
546 #define ESOS_TMR_FAILURE 0xFF
547 #define MAX_NUM_TMRS 16
548 
555 #define esos_GetNumberRunningTimers() (__esos_u8TmrSvcsRegistered)
556 
568 #define esos_IsTimerRunning(hndl) IS_BIT_SET_MASK(__esos_u32TmrActiveFlags, (ESOS_BIT0<<(hndl)))
569 #define __esos_MarkTimerRunning(hndl) BIT_SET_MASK(__esos_u32TmrActiveFlags, (ESOS_BIT0<<(hndl)))
570 #define __esos_MarkTimerStopped(hndl) BIT_CLEAR_MASK(__esos_u32TmrActiveFlags, (ESOS_BIT0<<(hndl)))
571 
572 
573 // System flag definitions... only ESOS needs to use these
574 #define __ESOS_SYS_FLAG_PACK_TASKS ESOS_BIT0
575 #define __ESOS_SYS_FLAG_NULL_LAST_TASK ESOS_BIT1
576 #define __ESOS_SYS_COMM_TX_IS_BUSY ESOS_BIT2
577 #define __ESOS_SYS_COMM_RX_IS_BUSY ESOS_BIT3
578 #define __ESOS_SYS_COMM_TX_ONGOING ESOS_BIT4
579 #define __ESOS_SYS_I2C_IN_USE ESOS_BIT8
580 #define __ESOS_SYS_SPI_IN_USE ESOS_BIT9
581 #define __ESOS_SYS_ADC_IN_USE ESOS_BIT10
582 
583 // Other useful macros for the user
584 #define __abs(x) (((x) < 0) ? -(x) : (x))
585 
586 #endif // ESOS_H
esos_mail.h
esos_UnregisterTask
uint8_t esos_UnregisterTask(uint8_t(*taskname)(ESOS_TASK_HANDLE pstTask))
Definition: esos.c:218
esos_GetFreeChildTaskStruct
ESOS_TASK_HANDLE esos_GetFreeChildTaskStruct()
Definition: esos.c:338
esos_irq.h
esos_task.h
__esos_hw_InitSystemTick
void __esos_hw_InitSystemTick(void)
Definition: esos_hwxxx_tick.c:102
esos_utils.h
esos_spi.h
esos_lcd44780wo.h
ESOS_TASK_HANDLE
esos_UnregisterTimer
uint8_t esos_UnregisterTimer(ESOS_TMR_HANDLE hnd_timer)
Definition: esos.c:451
stTimer
Definition: esos.h:175
esos_GetTimerHandle
ESOS_TMR_HANDLE esos_GetTimerHandle(void(*pfnTmrFcn)(void))
Definition: esos.c:472
user_init
void user_init(void)
Definition: app_example.c:807
esos_ChangeTimerPeriod
uint8_t esos_ChangeTimerPeriod(ESOS_TMR_HANDLE hnd_timer, uint32_t u32_period)
Definition: esos.c:499
stTask
Definition: esos_task.h:54
stMailEnvelope
Definition: esos.h:170
esos_comm.h
ESOS_TMR_HANDLE
uint8_t ESOS_TMR_HANDLE
Definition: esos.h:337
main_t
int main_t
Definition: esos.h:128
esos_wdog.h
esos_GetTaskHandleFromID
ESOS_TASK_HANDLE esos_GetTaskHandleFromID(uint16_t u16_TaskID)
Definition: esos.c:295
esos_GetTaskHandle
ESOS_TASK_HANDLE esos_GetTaskHandle(uint8_t(*taskname)(ESOS_TASK_HANDLE pstTask))
Definition: esos.c:259
esos_i2c.h
stMailBoxDesc
Definition: esos.h:158
esos_RegisterTimer
ESOS_TMR_HANDLE esos_RegisterTimer(void(*pfnTmrFcn)(void), uint32_t u32_period)
Definition: esos.c:422
esos_RegisterTask
ESOS_TASK_HANDLE esos_RegisterTask(uint8_t(*taskname)(ESOS_TASK_HANDLE pstTask))
Definition: esos.c:126
all_generic.h
Embedded Systems Operating System 32 bit (ESOS32) definitions to make ESOS32 code more generic and po...