summaryrefslogtreecommitdiff
path: root/common_modules/inc/txm_module.h
blob: 88f79d9ee9eb86181c47ac3329a6d96eac3673a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
/***************************************************************************
 * Copyright (c) 2024 Microsoft Corporation
 * Copyright (c) 2026-present Eclipse ThreadX contributors
 *
 * This program and the accompanying materials are made available under the
 * terms of the MIT License which is available at
 * https://opensource.org/licenses/MIT.
 *
 * SPDX-License-Identifier: MIT
 **************************************************************************/


/**************************************************************************/
/**************************************************************************/
/**                                                                       */
/** ThreadX Component                                                     */
/**                                                                       */
/**   Module Interface (API)                                              */
/**                                                                       */
/**************************************************************************/
/**************************************************************************/


/**************************************************************************/
/*                                                                        */
/*  APPLICATION INTERFACE DEFINITION                       RELEASE        */
/*                                                                        */
/*    txm_module.h                                        PORTABLE C      */
/*                                                           6.1.10       */
/*  AUTHOR                                                                */
/*                                                                        */
/*    Scott Larson, Microsoft Corporation                                 */
/*                                                                        */
/*  DESCRIPTION                                                           */
/*                                                                        */
/*    This file defines the basic module constants, interface structures, */
/*    and function prototypes.                                            */
/*                                                                        */
/**************************************************************************/

#ifndef TXM_MODULE_H
#define TXM_MODULE_H


/* Include the standard ThreadX API file.  */

#include "tx_api.h"

/* Include the module port specific file.  */

#include "txm_module_port.h"


/* Include any supported external component include files.  */

#ifdef TXM_MODULE_ENABLE_FILEX
#include "txm_module_filex.h"
#endif

#ifdef TXM_MODULE_ENABLE_GUIX
#include "txm_module_guix.h"
#endif

#ifdef TXM_MODULE_ENABLE_NETX
#include "txm_module_netx.h"
#endif

#ifdef TXM_MODULE_ENABLE_NETXDUO
#include "txm_module_netxduo.h"
#endif

#ifdef TXM_MODULE_ENABLE_USBX
#include "txm_module_usbx.h"
#endif


#ifdef FX_FILEX_PRESENT
#include "fx_api.h"
#endif


/* Determine if a C++ compiler is being used.  If so, ensure that standard
   C is used to process the API information.  */

#ifdef __cplusplus

/* Yes, C++ compiler is present.  Use standard C.  */
extern   "C" {

#endif


/* Define the Module ID, which is used to indicate a module is valid.  */

#define TXM_MODULE_ID                                       0x4D4F4455


/* Define valid module states.  */

#define TXM_MODULE_LOADED                                   1
#define TXM_MODULE_STARTED                                  2
#define TXM_MODULE_STOPPING                                 3
#define TXM_MODULE_STOPPED                                  4
#define TXM_MODULE_UNLOADED                                 5


/* Define module manager error codes.  */

#define TXM_MODULE_ALIGNMENT_ERROR                          0xF0
#define TXM_MODULE_ALREADY_LOADED                           0xF1
#define TXM_MODULE_INVALID                                  0xF2
#define TXM_MODULE_INVALID_PROPERTIES                       0xF3
#define TXM_MODULE_INVALID_MEMORY                           0xF4
#define TXM_MODULE_INVALID_CALLBACK                         0xF5
#define TXM_MODULE_INVALID_STACK_SIZE                       0xF6
#define TXM_MODULE_FILEX_INVALID_BYTES_READ                 0xF7
#define TXM_MODULE_MATH_OVERFLOW                            0xF8


/* Define the data area alignment mask, must be a power of 2.  */

#ifndef TXM_MODULE_DATA_ALIGNMENT
#define TXM_MODULE_DATA_ALIGNMENT                           4
#endif


/* Define the code area alignment mask, must be a power of 2.  */

#ifndef TXM_MODULE_CODE_ALIGNMENT
#define TXM_MODULE_CODE_ALIGNMENT                           4
#endif


/* Define module timeout for waiting for module to finish.  */

#ifndef TXM_MODULE_TIMEOUT
#define TXM_MODULE_TIMEOUT                                  100
#endif


/* Define module thread time-slice default.  */

#ifndef TXM_MODULE_TIME_SLICE
#define TXM_MODULE_TIME_SLICE                               4
#endif


/* Define each module's callback queue depth. This is used to queue up incoming call back requests.  */

#ifndef TXM_MODULE_CALLBACKS_QUEUE_DEPTH
#define TXM_MODULE_CALLBACKS_QUEUE_DEPTH                    8       /* Number queued callback requests.  */
#endif


/* Define the module manager thread's stack size.  */

#ifndef TXM_MODULE_MANAGER_THREAD_STACK_SIZE
#define TXM_MODULE_MANAGER_THREAD_STACK_SIZE                1024
#endif


/* Define the module manager thread's priority.  */

#ifndef TXM_MODULE_MANAGER_THREAD_PRIORITY
#define TXM_MODULE_MANAGER_THREAD_PRIORITY                  1
#endif


/* Define the module's callback handler thread's stack size.  */

#ifndef TXM_MODULE_CALLBACK_THREAD_STACK_SIZE
#define TXM_MODULE_CALLBACK_THREAD_STACK_SIZE                1024
#endif


/* Define the default port-specific macro for resetting the thread.  */

#ifndef TXM_MODULE_MANAGER_THREAD_RESET_PORT_COMPLETION
#define TXM_MODULE_MANAGER_THREAD_RESET_PORT_COMPLETION(thread_ptr, module_instance)
#endif


/* Define object types for object search requests.  */

#define TXM_BLOCK_POOL_OBJECT                               1
#define TXM_BYTE_POOL_OBJECT                                2
#define TXM_EVENT_FLAGS_OBJECT                              3
#define TXM_MUTEX_OBJECT                                    4
#define TXM_QUEUE_OBJECT                                    5
#define TXM_SEMAPHORE_OBJECT                                6
#define TXM_THREAD_OBJECT                                   7
#define TXM_TIMER_OBJECT                                    8
#define TXM_THREAD_KERNEL_STACK_OBJECT                      77
#define TXM_FILEX_OBJECTS_START                             100
#define TXM_FILEX_OBJECTS_END                               199
#define TXM_NETX_OBJECTS_START                              200
#define TXM_NETX_OBJECTS_END                                299
#define TXM_NETXDUO_OBJECTS_START                           300
#define TXM_NETXDUO_OBJECTS_END                             399
#define TXM_USBX_OBJECTS_START                              400
#define TXM_USBX_OBJECTS_END                                499
#define TXM_GUIX_OBJECTS_START                              500
#define TXM_GUIX_OBJECT_END                                 599


/* Define callback types.  */
#define TXM_THREADX_CALLBACKS_START                         0
#define TXM_THREADX_CALLBACKS_END                           99
#define TXM_FILEX_CALLBACKS_START                           100
#define TXM_FILEX_CALLBACKS_END                             199
#define TXM_NETX_CALLBACKS_START                            200
#define TXM_NETX_CALLBACKS_END                              299
#define TXM_NETXDUO_CALLBACKS_START                         300
#define TXM_NETXDUO_CALLBACKS_END                           399
#define TXM_USBX_CALLBACKS_START                            400
#define TXM_USBX_CALLBACKS_END                              499
#define TXM_GUIX_CALLBACKS_START                            500
#define TXM_GUIX_CALLBACKS_END                              599

#define TXM_TIMER_CALLBACK                                  0
#define TXM_EVENTS_SET_CALLBACK                             1
#define TXM_QUEUE_SEND_CALLBACK                             2
#define TXM_SEMAPHORE_PUT_CALLBACK                          3
#define TXM_THREAD_ENTRY_EXIT_CALLBACK                      4


/* Determine the ThreadX kernel API call IDs.  */

#define TXM_BLOCK_ALLOCATE_CALL                             1
#define TXM_BLOCK_POOL_CREATE_CALL                          2
#define TXM_BLOCK_POOL_DELETE_CALL                          3
#define TXM_BLOCK_POOL_INFO_GET_CALL                        4
#define TXM_BLOCK_POOL_PERFORMANCE_INFO_GET_CALL            5
#define TXM_BLOCK_POOL_PERFORMANCE_SYSTEM_INFO_GET_CALL     6
#define TXM_BLOCK_POOL_PRIORITIZE_CALL                      7
#define TXM_BLOCK_RELEASE_CALL                              8
#define TXM_BYTE_ALLOCATE_CALL                              9
#define TXM_BYTE_POOL_CREATE_CALL                           10
#define TXM_BYTE_POOL_DELETE_CALL                           11
#define TXM_BYTE_POOL_INFO_GET_CALL                         12
#define TXM_BYTE_POOL_PERFORMANCE_INFO_GET_CALL             13
#define TXM_BYTE_POOL_PERFORMANCE_SYSTEM_INFO_GET_CALL      14
#define TXM_BYTE_POOL_PRIORITIZE_CALL                       15
#define TXM_BYTE_RELEASE_CALL                               16
#define TXM_EVENT_FLAGS_CREATE_CALL                         17
#define TXM_EVENT_FLAGS_DELETE_CALL                         18
#define TXM_EVENT_FLAGS_GET_CALL                            19
#define TXM_EVENT_FLAGS_INFO_GET_CALL                       20
#define TXM_EVENT_FLAGS_PERFORMANCE_INFO_GET_CALL           21
#define TXM_EVENT_FLAGS_PERFORMANCE_SYSTEM_INFO_GET_CALL    22
#define TXM_EVENT_FLAGS_SET_CALL                            23
#define TXM_EVENT_FLAGS_SET_NOTIFY_CALL                     24
#define TXM_THREAD_INTERRUPT_CONTROL_CALL                   25
#define TXM_MUTEX_CREATE_CALL                               26
#define TXM_MUTEX_DELETE_CALL                               27
#define TXM_MUTEX_GET_CALL                                  28
#define TXM_MUTEX_INFO_GET_CALL                             29
#define TXM_MUTEX_PERFORMANCE_INFO_GET_CALL                 30
#define TXM_MUTEX_PERFORMANCE_SYSTEM_INFO_GET_CALL          31
#define TXM_MUTEX_PRIORITIZE_CALL                           32
#define TXM_MUTEX_PUT_CALL                                  33
#define TXM_QUEUE_CREATE_CALL                               34
#define TXM_QUEUE_DELETE_CALL                               35
#define TXM_QUEUE_FLUSH_CALL                                36
#define TXM_QUEUE_FRONT_SEND_CALL                           37
#define TXM_QUEUE_INFO_GET_CALL                             38
#define TXM_QUEUE_PERFORMANCE_INFO_GET_CALL                 39
#define TXM_QUEUE_PERFORMANCE_SYSTEM_INFO_GET_CALL          40
#define TXM_QUEUE_PRIORITIZE_CALL                           41
#define TXM_QUEUE_RECEIVE_CALL                              42
#define TXM_QUEUE_SEND_CALL                                 43
#define TXM_QUEUE_SEND_NOTIFY_CALL                          44
#define TXM_SEMAPHORE_CEILING_PUT_CALL                      45
#define TXM_SEMAPHORE_CREATE_CALL                           46
#define TXM_SEMAPHORE_DELETE_CALL                           47
#define TXM_SEMAPHORE_GET_CALL                              48
#define TXM_SEMAPHORE_INFO_GET_CALL                         49
#define TXM_SEMAPHORE_PERFORMANCE_INFO_GET_CALL             50
#define TXM_SEMAPHORE_PERFORMANCE_SYSTEM_INFO_GET_CALL      51
#define TXM_SEMAPHORE_PRIORITIZE_CALL                       52
#define TXM_SEMAPHORE_PUT_CALL                              53
#define TXM_SEMAPHORE_PUT_NOTIFY_CALL                       54
#define TXM_THREAD_CREATE_CALL                              55
#define TXM_THREAD_DELETE_CALL                              56
#define TXM_THREAD_ENTRY_EXIT_NOTIFY_CALL                   57
#define TXM_THREAD_IDENTIFY_CALL                            58
#define TXM_THREAD_INFO_GET_CALL                            59
#define TXM_THREAD_PERFORMANCE_INFO_GET_CALL                60
#define TXM_THREAD_PERFORMANCE_SYSTEM_INFO_GET_CALL         61
#define TXM_THREAD_PREEMPTION_CHANGE_CALL                   62
#define TXM_THREAD_PRIORITY_CHANGE_CALL                     63
#define TXM_THREAD_RELINQUISH_CALL                          64
#define TXM_THREAD_RESET_CALL                               65
#define TXM_THREAD_RESUME_CALL                              66
#define TXM_THREAD_SLEEP_CALL                               67
#define TXM_THREAD_STACK_ERROR_NOTIFY_CALL                  68
#define TXM_THREAD_SUSPEND_CALL                             69
#define TXM_THREAD_TERMINATE_CALL                           70
#define TXM_THREAD_TIME_SLICE_CHANGE_CALL                   71
#define TXM_THREAD_WAIT_ABORT_CALL                          72
#define TXM_TIME_GET_CALL                                   73
#define TXM_TIME_SET_CALL                                   74
#define TXM_TIMER_ACTIVATE_CALL                             75
#define TXM_TIMER_CHANGE_CALL                               76
#define TXM_TIMER_CREATE_CALL                               77
#define TXM_TIMER_DEACTIVATE_CALL                           78
#define TXM_TIMER_DELETE_CALL                               79
#define TXM_TIMER_INFO_GET_CALL                             80
#define TXM_TIMER_PERFORMANCE_INFO_GET_CALL                 81
#define TXM_TIMER_PERFORMANCE_SYSTEM_INFO_GET_CALL          82
#define TXM_TRACE_ENABLE_CALL                               83
#define TXM_TRACE_EVENT_FILTER_CALL                         84
#define TXM_TRACE_EVENT_UNFILTER_CALL                       85
#define TXM_TRACE_DISABLE_CALL                              86
#define TXM_TRACE_INTERRUPT_CONTROL_CALL                    87
#define TXM_TRACE_ISR_ENTER_INSERT_CALL                     88
#define TXM_TRACE_ISR_EXIT_INSERT_CALL                      89
#define TXM_TRACE_BUFFER_FULL_NOTIFY_CALL                   90
#define TXM_TRACE_USER_EVENT_INSERT_CALL                    91
#define TXM_THREAD_SYSTEM_SUSPEND_CALL                      92
#define TXM_MODULE_OBJECT_POINTER_GET_CALL                  93
#define TXM_MODULE_OBJECT_POINTER_GET_EXTENDED_CALL         94
#define TXM_MODULE_OBJECT_ALLOCATE_CALL                     95
#define TXM_MODULE_OBJECT_DEALLOCATE_CALL                   96

#define TXM_MODULE_PORT_EXTENSION_API_ID_START              500
#define TXM_MODULE_PORT_EXTENSION_API_ID_END                999

/* Determine the API call IDs for other components.  */

#define TXM_FILEX_API_ID_START                              1000
#define TXM_FILEX_API_ID_END                                1999
#define TXM_NETX_API_ID_START                               2000
#define TXM_NETX_API_ID_END                                 2999
#define TXM_NETXDUO_API_ID_START                            3000
#define TXM_NETXDUO_API_ID_END                              3999
#define TXM_USBX_API_ID_START                               4000
#define TXM_USBX_API_ID_END                                 4999
#define TXM_GUIX_API_ID_START                               5000
#define TXM_GUIX_API_ID_END                                 5999


/* Determine the application's IDs for calling application code in the resident area.  */

#define TXM_APPLICATION_REQUEST_ID_BASE                     0x10000


/* Define the overlay for the module's preamble.  */

typedef struct TXM_MODULE_PREAMBLE_STRUCT
{
                                                                        /* Meaning                                      */
    ULONG               txm_module_preamble_id;                         /* Download Module ID (0x54584D44)              */
    ULONG               txm_module_preamble_version_major;              /* Major Version ID                             */
    ULONG               txm_module_preamble_version_minor;              /* Minor Version ID                             */
    ULONG               txm_module_preamble_preamble_size;              /* Module Preamble Size, in 32-bit words        */
    ULONG               txm_module_preamble_application_module_id;      /* Module ID (application defined)              */
    ULONG               txm_module_preamble_property_flags;             /* Properties Bit Map                           */
    ULONG               txm_module_preamble_shell_entry_function;       /* Module shell Entry Function                  */
    ULONG               txm_module_preamble_start_function;             /* Module Thread Start Function                 */
    ULONG               txm_module_preamble_stop_function;              /* Module Thread Stop Function                  */
    ULONG               txm_module_preamble_start_stop_priority;        /* Module Start/Stop Thread Priority            */
    ULONG               txm_module_preamble_start_stop_stack_size;      /* Module Start/Stop Thread Priority            */
    ULONG               txm_module_preamble_callback_function;          /* Module Callback Thread Function              */
    ULONG               txm_module_preamble_callback_priority;          /* Module Callback Thread Priority              */
    ULONG               txm_module_preamble_callback_stack_size;        /* Module Callback Thread Stack Size            */
    ULONG               txm_module_preamble_code_size;                  /* Module Instruction Area Size                 */
    ULONG               txm_module_preamble_data_size;                  /* Module Data Area Size                        */
    ULONG               txm_module_preamble_reserved_0;                 /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_1;                 /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_2;                 /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_3;                 /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_4;                 /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_5;                 /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_6;                 /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_7;                 /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_8;                 /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_9;                 /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_10;                /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_11;                /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_12;                /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_13;                /* Reserved                                     */
    ULONG               txm_module_preamble_reserved_14;                /* Reserved                                     */
    ULONG               txm_module_preamble_checksum;                   /* Module Instruction Area Checksum [Optional]  */

} TXM_MODULE_PREAMBLE;


struct TXM_MODULE_ALLOCATED_OBJECT_STRUCT;


/* Define the callback notification structure used to communicate between the module's callback handling thread
   and the module manager.  */

typedef struct TXM_MODULE_CALLBACK_MESSAGE_STRUCT
{
    ULONG               txm_module_callback_message_type;
    ULONG               txm_module_callback_message_activation_count;
    VOID                (*txm_module_callback_message_application_function)(VOID);
    ALIGN_TYPE          txm_module_callback_message_param_1;
    ALIGN_TYPE          txm_module_callback_message_param_2;
    ALIGN_TYPE          txm_module_callback_message_param_3;
    ALIGN_TYPE          txm_module_callback_message_param_4;
    ALIGN_TYPE          txm_module_callback_message_param_5;
    ALIGN_TYPE          txm_module_callback_message_param_6;
    ALIGN_TYPE          txm_module_callback_message_param_7;
    ALIGN_TYPE          txm_module_callback_message_param_8;
    ALIGN_TYPE          txm_module_callback_message_reserved1;
    ALIGN_TYPE          txm_module_callback_message_reserved2;
} TXM_MODULE_CALLBACK_MESSAGE;


/* Define the module's instance for the manager.  */

typedef struct TXM_MODULE_INSTANCE_STRUCT
{
    ULONG               txm_module_instance_id;
    CHAR                *txm_module_instance_name;
    ULONG               txm_module_instance_state;
    ULONG               txm_module_instance_property_flags;
    VOID                *txm_module_instance_code_allocation_ptr;
    ULONG               txm_module_instance_code_allocation_size;
    VOID                *txm_module_instance_code_start;
    VOID                *txm_module_instance_code_end;
    ULONG               txm_module_instance_code_size;
    VOID                *txm_module_instance_data_allocation_ptr;
    ULONG               txm_module_instance_data_allocation_size;
    VOID                *txm_module_instance_data_start;
    VOID                *txm_module_instance_data_end;
    VOID                *txm_module_instance_module_data_base_address;
    ULONG               txm_module_instance_data_size;
    ULONG               txm_module_instance_total_ram_usage;
    VOID                *txm_module_instance_start_stop_stack_start_address;
    VOID                *txm_module_instance_start_stop_stack_end_address;
    VOID                *txm_module_instance_callback_stack_start_address;
    VOID                *txm_module_instance_callback_stack_end_address;
    TXM_MODULE_PREAMBLE *txm_module_instance_preamble_ptr;
    VOID                (*txm_module_instance_shell_entry_function)(TX_THREAD *, struct TXM_MODULE_INSTANCE_STRUCT *);
    VOID                (*txm_module_instance_start_thread_entry)(ULONG);
    VOID                (*txm_module_instance_stop_thread_entry)(ULONG);
    VOID                (*txm_module_instance_callback_request_thread_entry)(ULONG);

    /* Define the port extention to the module manager structure.  */
    TXM_MODULE_MANAGER_PORT_EXTENSION

    TX_THREAD           txm_module_instance_start_stop_thread;
    TX_THREAD           txm_module_instance_callback_request_thread;
    TX_QUEUE            txm_module_instance_callback_request_queue;
    ULONG               txm_module_instance_callback_request_queue_area[TXM_MODULE_CALLBACKS_QUEUE_DEPTH * (sizeof(TXM_MODULE_CALLBACK_MESSAGE)/sizeof(ULONG))];
    ULONG               txm_module_instance_start_stop_stack_size;
    ULONG               txm_module_instance_start_stop_priority;
    ULONG               txm_module_instance_callback_stack_size;
    ULONG               txm_module_instance_callback_priority;
    ULONG               txm_module_instance_application_module_id;
    UINT                txm_module_instance_maximum_priority;

    /* Define the head pointer of the list of objects allocated by the module.  */
    struct TXM_MODULE_ALLOCATED_OBJECT_STRUCT
                        *txm_module_instance_object_list_head;
    ULONG               txm_module_instance_object_list_count;

    struct TXM_MODULE_INSTANCE_STRUCT
                        *txm_module_instance_loaded_next,
                        *txm_module_instance_loaded_previous;
} TXM_MODULE_INSTANCE;


/* Determine if the thread entry info control block has an extension defined. If not, define the extension to
   whitespace.  */

#ifndef TXM_MODULE_THREAD_ENTRY_INFO_USER_EXTENSION
#define TXM_MODULE_THREAD_ENTRY_INFO_USER_EXTENSION
#endif


/* Define the thread entry information structure. This structure is placed on the thread's stack such that the
   module's _txm_thread_shell_entry function does not need to access anything in the thread control block.  */

typedef struct TXM_MODULE_THREAD_ENTRY_INFO_STRUCT
{
    TX_THREAD           *txm_module_thread_entry_info_thread;
    TXM_MODULE_INSTANCE *txm_module_thread_entry_info_module;
    VOID                *txm_module_thread_entry_info_data_base_address;     /* Don't move this, referenced in stack build to setup module data base register. */
    VOID                *txm_module_thread_entry_info_code_base_address;
    VOID               (*txm_module_thread_entry_info_entry)(ULONG);
    ULONG                txm_module_thread_entry_info_parameter;
    VOID               (*txm_module_thread_entry_info_exit_notify)(struct TX_THREAD_STRUCT *, UINT);
    UINT                 txm_module_thread_entry_info_start_thread;
    TX_THREAD           *txm_module_thread_entry_info_callback_request_thread;
    TX_QUEUE            *txm_module_thread_entry_info_callback_request_queue;
    VOID                *txm_module_thread_entry_info_reserved;
    ALIGN_TYPE          (*txm_module_thread_entry_info_kernel_call_dispatcher)(ULONG kernel_request, ALIGN_TYPE param_1, ALIGN_TYPE param_2, ALIGN_TYPE param_3);
    TXM_MODULE_THREAD_ENTRY_INFO_USER_EXTENSION
} TXM_MODULE_THREAD_ENTRY_INFO;


/* Define the linked-list structure used to maintain the module's object allocation.  */

typedef struct TXM_MODULE_ALLOCATED_OBJECT_STRUCT
{

    TXM_MODULE_INSTANCE *txm_module_allocated_object_module_instance;
    struct TXM_MODULE_ALLOCATED_OBJECT_STRUCT
                        *txm_module_allocated_object_next,
                        *txm_module_allocated_object_previous;
    ULONG               txm_module_object_size;
} TXM_MODULE_ALLOCATED_OBJECT;


/*  Determine if module code is being compiled. If so, remap the ThreadX API to
    the module shell functions that will go through the module <-> module manager
    interface.  */

#ifdef TXM_MODULE


/* Define the external reference to the module manager kernel dispatcher function pointer. This is supplied to the module by the module
   manager when the module is created and started.  */

extern ALIGN_TYPE (*_txm_module_kernel_call_dispatcher)(ULONG type, ALIGN_TYPE param_1, ALIGN_TYPE param_2, ALIGN_TYPE param3);


/* Define specific module function prototypes.  */

#define txm_module_application_request                  _txm_module_application_request
#define txm_module_object_allocate                      _txm_module_object_allocate
#define txm_module_object_deallocate                    _txm_module_object_deallocate
#define txm_module_object_pointer_get                   _txm_module_object_pointer_get
#define txm_module_object_pointer_get_extended          _txm_module_object_pointer_get_extended

VOID  _txm_module_thread_shell_entry(TX_THREAD *thread_ptr, TXM_MODULE_THREAD_ENTRY_INFO *thread_info);
UINT  _txm_module_thread_system_suspend(TX_THREAD *thread_ptr);

UINT  _txm_module_application_request(ULONG request, ALIGN_TYPE param_1, ALIGN_TYPE param_2, ALIGN_TYPE param_3);
VOID  _txm_module_callback_request_thread_entry(ULONG id);
UINT  _txm_module_object_allocate(VOID **object_ptr, ULONG object_size);
UINT  _txm_module_object_deallocate(VOID *object_ptr);
UINT  _txm_module_object_pointer_get(UINT object_type, CHAR *name, VOID **object_ptr);
UINT  _txm_module_object_pointer_get_extended(UINT object_type, CHAR *name, UINT name_length, VOID **object_ptr);

/* Module callback functions.  */

#ifdef TXM_MODULE_ENABLE_NETX
VOID  _txm_module_netx_callback_request(TXM_MODULE_CALLBACK_MESSAGE *callback_message);
#endif
#ifdef TXM_MODULE_ENABLE_NETXDUO
VOID  _txm_module_netxduo_callback_request(TXM_MODULE_CALLBACK_MESSAGE *callback_message);
#endif
#ifdef TXM_MODULE_ENABLE_FILEX
VOID  _txm_module_filex_callback_request(TXM_MODULE_CALLBACK_MESSAGE *callback_message);
#endif
#ifdef TXM_MODULE_ENABLE_GUIX
VOID  _txm_module_guix_duo_callback_request(TXM_MODULE_CALLBACK_MESSAGE *callback_message);
#endif
#ifdef TXM_MODULE_ENABLE_USBX
VOID  _txm_module_usbx_duo_callback_request(TXM_MODULE_CALLBACK_MESSAGE *callback_message);
#endif

/* Define the module's thread shell entry function macros.  */

#define TXM_THREAD_COMPLETED_EXTENSION(a)
#define TXM_THREAD_STATE_CHANGE(a, b)

#else


/* Map the module manager APIs just in case this is being included from the module manager in the
   resident portion of the application.  */

#define txm_module_manager_initialize                   _txm_module_manager_initialize
#define txm_module_manager_absolute_load                _txm_module_manager_absolute_load
#define txm_module_manager_in_place_load                _txm_module_manager_in_place_load
#define txm_module_manager_file_load                    _txm_module_manager_file_load
#define txm_module_manager_memory_load                  _txm_module_manager_memory_load
#define txm_module_manager_object_pointer_get           _txm_module_manager_object_pointer_get
#define txm_module_manager_object_pointer_get_extended  _txm_module_manager_object_pointer_get_extended
#define txm_module_manager_object_pool_create           _txm_module_manager_object_pool_create
#define txm_module_manager_properties_get               _txm_module_manager_properties_get
#define txm_module_manager_start                        _txm_module_manager_start
#define txm_module_manager_stop                         _txm_module_manager_stop
#define txm_module_manager_unload                       _txm_module_manager_unload
#define txm_module_manager_maximum_module_priority_set  _txm_module_manager_maximum_module_priority_set
#define txm_module_manager_external_memory_enable       _txm_module_manager_external_memory_enable

/* Define external variables used by module manager functions.  */

#ifndef TX_MODULE_MANAGER_INIT
extern ULONG                                        _txm_module_manager_properties_supported;
extern ULONG                                        _txm_module_manager_properties_required;
extern TX_BYTE_POOL                                 _txm_module_manager_byte_pool;
extern TX_BYTE_POOL                                 _txm_module_manager_object_pool;
extern UINT                                         _txm_module_manager_object_pool_created;
extern TXM_MODULE_INSTANCE                          *_txm_module_manager_loaded_list_ptr;
extern ULONG                                        _txm_module_manger_loaded_count;
extern UINT                                         _txm_module_manager_ready;
extern TX_MUTEX                                     _txm_module_manager_mutex;
extern ULONG                                        _txm_module_manager_callback_total_count;
extern ULONG                                        _txm_module_manager_callback_error_count;
#endif

/* Define internal module manager function prototypes.  */

UINT  _txm_module_manager_application_request(ULONG request, ALIGN_TYPE param_1, ALIGN_TYPE param_2, ALIGN_TYPE param_3);
#ifdef FX_FILEX_PRESENT
UINT  _txm_module_manager_file_load(TXM_MODULE_INSTANCE *module_instance, CHAR *module_name, FX_MEDIA *media_ptr, CHAR *file_name);
#endif
UINT  _txm_module_manager_initialize(VOID *module_memory_start, ULONG module_memory_size);
UINT  _txm_module_manager_absolute_load(TXM_MODULE_INSTANCE *module_instance, CHAR *name, VOID *module_location);
UINT  _txm_module_manager_in_place_load(TXM_MODULE_INSTANCE *module_instance, CHAR *name, VOID *module_location);
UINT  _txm_module_manager_internal_load(TXM_MODULE_INSTANCE *module_instance, CHAR *name, VOID *module_location,
                                        ULONG code_size, VOID *code_allocation_ptr, ULONG code_allocation_size);
ALIGN_TYPE _txm_module_manager_kernel_dispatch(ULONG kernel_request, ALIGN_TYPE param_0, ALIGN_TYPE param_1, ALIGN_TYPE param_2);
UINT  _txm_module_manager_object_allocate(VOID **object_ptr_ptr, ULONG object_size, TXM_MODULE_INSTANCE *module_instance);
UINT  _txm_module_manager_object_deallocate(VOID *object_ptr);
UINT  _txm_module_manager_object_pointer_get(UINT object_type, CHAR *name, VOID **object_ptr);
UINT  _txm_module_manager_object_pointer_get_extended(UINT object_type, CHAR *name, UINT name_length, VOID **object_ptr);
UINT  _txm_module_manager_object_pool_create(VOID *object_memory, ULONG object_memory_size);
VOID  _txm_module_manager_object_type_set(ULONG object_ptr, ULONG object_size, ULONG object_type);
UINT  _txm_module_manager_memory_load(TXM_MODULE_INSTANCE *module_instance, CHAR *module_name, VOID *module_location);
UINT  _txm_module_manager_properties_get(TXM_MODULE_INSTANCE *module_instance, ULONG *module_properties_ptr);
UINT  _txm_module_manager_start(TXM_MODULE_INSTANCE *module_instance);
UINT  _txm_module_manager_stop(TXM_MODULE_INSTANCE *module_instance);
UINT  _txm_module_manager_thread_create(TX_THREAD *thread_ptr, CHAR *name, VOID (*shell_function)(TX_THREAD *, TXM_MODULE_INSTANCE *),
                               VOID (*entry_function)(ULONG), ULONG entry_input,
                               VOID *stack_start, ULONG stack_size, UINT priority, UINT preempt_threshold,
                               ULONG time_slice, UINT auto_start, UINT thread_control_block_size, TXM_MODULE_INSTANCE *module_instance);
UINT  _txm_module_manager_thread_reset(TX_THREAD *thread_ptr);
VOID  _txm_module_manager_name_build(CHAR *module_name, CHAR *thread_name, CHAR *combined_name);
VOID  _txm_module_manager_thread_stack_build(TX_THREAD *thread_ptr, VOID (*shell_function)(TX_THREAD *, TXM_MODULE_INSTANCE *));
UINT  _txm_module_manager_unload(TXM_MODULE_INSTANCE *module_instance);
ALIGN_TYPE  _txm_module_manager_user_mode_entry(ULONG kernel_request, ALIGN_TYPE param_1, ALIGN_TYPE param_2, ALIGN_TYPE param_3);
UINT  _txm_module_manager_maximum_module_priority_set(TXM_MODULE_INSTANCE *module_instance, UINT priority);
UINT  _txm_module_manager_external_memory_enable(TXM_MODULE_INSTANCE *module_instance, VOID *start_address, ULONG length, UINT attributes);

#ifdef TXM_MODULE_ENABLE_NETX
ULONG  _txm_module_manager_netx_dispatch(TXM_MODULE_INSTANCE *module_instance, ULONG kernel_request, ULONG param_1, ULONG param_2, ULONG param_3);
UINT  _txm_module_manager_netx_object_pointer_get(UINT object_type, CHAR *name, UINT name_length, VOID **object_ptr);
#endif

#ifdef TXM_MODULE_ENABLE_NETXDUO
ALIGN_TYPE  _txm_module_manager_netxduo_dispatch(TXM_MODULE_INSTANCE *module_instance, ULONG kernel_request, ALIGN_TYPE param_1, ALIGN_TYPE param_2, ALIGN_TYPE param_3);
UINT  _txm_module_manager_netxduo_object_pointer_get(UINT object_type, CHAR *name, UINT name_length, VOID **object_ptr);
#endif

#ifdef TXM_MODULE_ENABLE_FILEX
ALIGN_TYPE _txm_module_manager_filex_dispatch(TXM_MODULE_INSTANCE *module_instance, ULONG kernel_request, ALIGN_TYPE param_0, ALIGN_TYPE param_1, ALIGN_TYPE param_2);
UINT  _txm_module_manager_filex_object_pointer_get(UINT object_type, CHAR *name, UINT name_length, VOID **object_ptr);
#endif

#ifdef TXM_MODULE_ENABLE_GUIX
ULONG  _txm_module_manager_guix_dispatch(TXM_MODULE_INSTANCE *module_instance, ULONG kernel_request, ULONG param_1, ULONG param_2, ULONG param_3);
UINT  _txm_module_manager_guix_object_pointer_get(UINT object_type, CHAR *name, UINT name_length, VOID **object_ptr);
#endif

#ifdef TXM_MODULE_ENABLE_USBX
ULONG  _txm_module_manager_usbx_dispatch(TXM_MODULE_INSTANCE *module_instance, ULONG kernel_request, ULONG param_1, ULONG param_2, ULONG param_3);
UINT  _txm_module_manager_usbx_object_pointer_get(UINT object_type, CHAR *name, UINT name_length, VOID **object_ptr);
#endif

/* Define the callback deferred processing routines necessary for executing callbacks in the module code.  */

VOID  _txm_module_manager_callback_request(TX_QUEUE *module_callback_queue, TXM_MODULE_CALLBACK_MESSAGE  *callback_request);
VOID  _txm_module_manager_event_flags_notify_trampoline(TX_EVENT_FLAGS_GROUP *group_ptr);
VOID  _txm_module_manager_queue_notify_trampoline(TX_QUEUE *queue_ptr);
VOID  _txm_module_manager_semaphore_notify_trampoline(TX_SEMAPHORE *semaphore_ptr);
VOID  _txm_module_manager_thread_notify_trampoline(TX_THREAD *thread_ptr, UINT type);
VOID  _txm_module_manager_timer_notify_trampoline(ULONG id);


/* Define port specific module manager prototypes.  */

TXM_MODULE_MANAGER_ADDITIONAL_PROTOTYPES

#endif


/* Determine if a C++ compiler is being used.  If so, complete the standard
   C conditional started above.  */
#ifdef __cplusplus
        }
#endif

#endif