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
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
|
/**
* @file IxOsal.h
*
* @brief Top include file for OSAL
*
*
* @par
* IXP400 SW Release version 2.0
*
* -- Copyright Notice --
*
* @par
* Copyright 2001-2005, Intel Corporation.
* All rights reserved.
*
* @par
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* @par
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @par
* -- End of Copyright Notice --
*/
#ifndef IxOsal_H
#define IxOsal_H
/* Basic types */
#include "IxOsalTypes.h"
/* Include assert */
#include "IxOsalAssert.h"
/*
* Config header gives users option to choose IO MEM
* and buffer management modules
*/
#include "IxOsalConfig.h"
/*
* Symbol file needed by some OS.
*/
#include "IxOsalUtilitySymbols.h"
/* OS-specific header */
#include "IxOsalOs.h"
/**
* @defgroup IxOsal Operating System Abstraction Layer (IxOsal) API
*
* @brief This service provides a thin layer of OS dependency services.
*
* This file contains the API to the functions which are some what OS dependant and would
* require porting to a particular OS.
* A primary focus of the component development is to make them as OS independent as possible.
* All other components should abstract their OS dependency to this module.
* Services overview
* -# Data types, constants, defines
* -# Interrupts
* - bind interrupts to handlers
* - unbind interrupts from handlers
* - disables all interrupts
* - enables all interrupts
* - selectively disables interrupts
* - enables an interrupt level
* - disables an interrupt level
* -# Memory
* - allocates memory
* - frees memory
* - copies memory zones
* - fills a memory zone
* - allocates cache-safe memory
* - frees cache-safe memory
* - physical to virtual address translation
* - virtual to physical address translation
* - cache to memory flush
* - cache line invalidate
* -# Threads
* - creates a new thread
* - starts a newly created thread
* - kills an existing thread
* - exits a running thread
* - sets the priority of an existing thread
* - suspends thread execution
* - resumes thread execution
* -# IPC
* - creates a message queue
* - deletes a message queue
* - sends a message to a message queue
* - receives a message from a message queue
* -# Thread Synchronisation
* - initializes a mutex
* - locks a mutex
* - unlocks a mutex
* - non-blocking attempt to lock a mutex
* - destroys a mutex object
* - initializes a fast mutex
* - non-blocking attempt to lock a fast mutex
* - unlocks a fast mutex
* - destroys a fast mutex object
* - initializes a semaphore
* - posts to (increments) a semaphore
* - waits on (decrements) a semaphore
* - non-blocking wait on semaphore
* - gets semaphore value
* - destroys a semaphore object
* - yields execution of current thread
* -# Time functions
* - yielding sleep for a number of milliseconds
* - busy sleep for a number of microseconds
* - value of the timestamp counter
* - resolution of the timestamp counter
* - system clock rate, in ticks
* - current system time
* - converts ixOsalTimeVal into ticks
* - converts ticks into ixOsalTimeVal
* - converts ixOsalTimeVal to milliseconds
* - converts milliseconds to IxOsalTimeval
* - "equal" comparison for IxOsalTimeval
* - "less than" comparison for IxOsalTimeval
* - "greater than" comparison for IxOsalTimeval
* - "add" operator for IxOsalTimeval
* - "subtract" operator for IxOsalTimeval
* -# Logging
* - sets the current logging verbosity level
* - interrupt-safe logging function
* -# Timer services
* - schedules a repeating timer
* - schedules a single-shot timer
* - cancels a running timer
* - displays all the running timers
* -# Optional Modules
* - Buffer management module
* - I/O memory and endianess support module
*
* @{
*/
/*
* Prototypes
*/
/* ========================== Interrupts ================================
*
*/
/**
* @ingroup IxOsal
*
* @brief Binds an interrupt handler to an interrupt level
*
* @param irqLevel (in) - interrupt level
* @param irqHandler (in) - interrupt handler
* @param parameter (in) - custom parameter to be passed to the
* interrupt handler
*
* Binds an interrupt handler to an interrupt level. The operation will
* fail if the wrong level is selected, if the handler is NULL, or if the
* interrupt is already bound. This functions binds the specified C
* routine to an interrupt level. When called, the "parameter" value will
* be passed to the routine.
*
* Reentrant: no
* IRQ safe: no
*
* @return IX_SUCCESS if the operation succeeded or IX_FAIL otherwise
*/
PUBLIC IX_STATUS ixOsalIrqBind (UINT32 irqLevel,
IxOsalVoidFnVoidPtr irqHandler,
void *parameter);
/**
* @ingroup IxOsal
*
* @brief Unbinds an interrupt handler from an interrupt level
*
* @param irqLevel (in) - interrupt level
*
* Unbinds the selected interrupt level from any previously registered
* handler
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return IX_SUCCESS if the operation succeeded or IX_FAIL otherwise
*/
PUBLIC IX_STATUS ixOsalIrqUnbind (UINT32 irqLevel);
/**
* @ingroup IxOsal
*
* @brief Disables all interrupts
*
* @param - none
*
* Disables all the interrupts and prevents tasks scheduling
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return interrupt enable status prior to locking
*/
PUBLIC UINT32 ixOsalIrqLock (void);
/**
* @ingroup IxOsal
*
* @brief Enables all interrupts
*
* @param irqEnable (in) - interrupt enable status, prior to interrupt
* locking
*
* Enables the interrupts and task scheduling, cancelling the effect
* of ixOsalIrqLock()
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return IX_SUCCESS if the operation succeeded or IX_FAIL otherwise
*/
PUBLIC void ixOsalIrqUnlock (UINT32 irqEnable);
/**
* @ingroup IxOsal
*
* @brief Selectively disables interrupts
*
* @param irqLevel new interrupt level
*
* Disables the interrupts below the specified interrupt level
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @note Depending on the implementation this function can disable all
* the interrupts
*
* @return previous interrupt level
*/
PUBLIC UINT32 ixOsalIrqLevelSet (UINT32 irqLevel);
/**
* @ingroup IxOsal
*
* @brief Enables an interrupt level
*
* @param irqLevel interrupt level to enable
*
* Enables the specified interrupt level
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return - none
*/
PUBLIC void ixOsalIrqEnable (UINT32 irqLevel);
/**
* @ingroup IxOsal
*
* @brief Disables an interrupt level
*
* @param irqLevel interrupt level to disable
*
* Disables the specified interrupt level
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return - none
*/
PUBLIC void ixOsalIrqDisable (UINT32 irqLevel);
/* ============================= Memory =================================
*
*/
/**
* @ingroup IxOsal
*
* @brief Allocates memory
*
* @param size - memory size to allocate, in bytes
*
* Allocates a memory zone of a given size
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return Pointer to the allocated zone or NULL if the allocation failed
*/
PUBLIC void *ixOsalMemAlloc (UINT32 size);
/**
* @ingroup IxOsal
*
* @brief Frees memory
*
* @param ptr - pointer to the memory zone
*
* Frees a previously allocated memory zone
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - none
*/
PUBLIC void ixOsalMemFree (void *ptr);
/**
* @ingroup IxOsal
*
* @brief Copies memory zones
*
* @param dest - destination memory zone
* @param src - source memory zone
* @param count - number of bytes to copy
*
* Copies count bytes from the source memory zone pointed by src into the
* memory zone pointed by dest.
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return Pointer to the destination memory zone
*/
PUBLIC void *ixOsalMemCopy (void *dest, void *src, UINT32 count);
/**
* @ingroup IxOsal
*
* @brief Fills a memory zone
*
* @param ptr - pointer to the memory zone
* @param filler - byte to fill the memory zone with
* @param count - number of bytes to fill
*
* Fills a memory zone with a given constant byte
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return Pointer to the memory zone
*/
PUBLIC void *ixOsalMemSet (void *ptr, UINT8 filler, UINT32 count);
/**
* @ingroup IxOsal
*
* @brief Allocates cache-safe memory
*
* @param size - size, in bytes, of the allocated zone
*
* Allocates a cache-safe memory zone of at least "size" bytes and returns
* the pointer to the memory zone. This memory zone, depending on the
* platform, is either uncached or aligned on a cache line boundary to make
* the CACHE_FLUSH and CACHE_INVALIDATE macros safe to use. The memory
* allocated with this function MUST be freed with ixOsalCacheDmaFree(),
* otherwise memory corruption can occur.
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return Pointer to the memory zone or NULL if allocation failed
*
* @note It is important to note that cache coherence is maintained in
* software by using the IX_OSAL_CACHE_FLUSH and IX_OSAL_CACHE_INVALIDATE
* macros to maintain consistency between cache and external memory.
*/
PUBLIC void *ixOsalCacheDmaMalloc (UINT32 size);
/* Macros for ixOsalCacheDmaMalloc*/
#define IX_OSAL_CACHE_DMA_MALLOC(size) ixOsalCacheDmaMalloc(size)
/**
* @ingroup IxOsal
*
* @brief Frees cache-safe memory
*
* @param ptr - pointer to the memory zone
*
* Frees a memory zone previously allocated with ixOsalCacheDmaMalloc()
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - none
*/
PUBLIC void ixOsalCacheDmaFree (void *ptr);
#define IX_OSAL_CACHE_DMA_FREE(ptr) ixOsalCacheDmaFree(ptr)
/**
* @ingroup IxOsal
*
* @brief physical to virtual address translation
*
* @param physAddr - physical address
*
* Converts a physical address into its equivalent MMU-mapped virtual address
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return Corresponding virtual address, as UINT32
*/
#define IX_OSAL_MMU_PHYS_TO_VIRT(physAddr) \
IX_OSAL_OS_MMU_PHYS_TO_VIRT(physAddr)
/**
* @ingroup IxOsal
*
* @brief virtual to physical address translation
*
* @param virtAddr - virtual address
*
* Converts a virtual address into its equivalent MMU-mapped physical address
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return Corresponding physical address, as UINT32
*/
#define IX_OSAL_MMU_VIRT_TO_PHYS(virtAddr) \
IX_OSAL_OS_MMU_VIRT_TO_PHYS(virtAddr)
/**
* @ingroup IxOsal
*
* @brief cache to memory flush
*
* @param addr - memory address to flush from cache
* @param size - number of bytes to flush (rounded up to a cache line)
*
* Flushes the cached value of the memory zone pointed by "addr" into memory,
* rounding up to a cache line. Use before the zone is to be read by a
* processing unit which is not cache coherent with the main CPU.
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return - none
*/
#define IX_OSAL_CACHE_FLUSH(addr, size) IX_OSAL_OS_CACHE_FLUSH(addr, size)
/**
* @ingroup IxOsal
*
* @brief cache line invalidate
*
* @param addr - memory address to invalidate in cache
* @param size - number of bytes to invalidate (rounded up to a cache line)
*
* Invalidates the cached value of the memory zone pointed by "addr",
* rounding up to a cache line. Use before reading the zone from the main
* CPU, if the zone has been updated by a processing unit which is not cache
* coherent with the main CPU.
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return - none
*/
#define IX_OSAL_CACHE_INVALIDATE(addr, size) IX_OSAL_OS_CACHE_INVALIDATE(addr, size)
/* ============================= Threads =================================
*
*/
/**
* @ingroup IxOsal
*
* @brief Creates a new thread
*
* @param thread - handle of the thread to be created
* @param threadAttr - pointer to a thread attribute object
* @param startRoutine - thread entry point
* @param arg - argument given to the thread
*
* Creates a thread given a thread handle and a thread attribute object. The
* same thread attribute object can be used to create separate threads. "NULL"
* can be specified as the attribute, in which case the default values will
* be used. The thread needs to be explicitly started using ixOsalThreadStart().
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalThreadCreate (IxOsalThread * thread,
IxOsalThreadAttr * threadAttr,
IxOsalVoidFnVoidPtr startRoutine,
void *arg);
/**
* @ingroup IxOsal
*
* @brief Starts a newly created thread
*
* @param thread - handle of the thread to be started
*
* Starts a thread given its thread handle. This function is to be called
* only once, following the thread initialization.
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalThreadStart (IxOsalThread * thread);
/**
* @ingroup IxOsal
*
* @brief Kills an existing thread
*
* @param thread - handle of the thread to be killed
*
* Kills a thread given its thread handle.
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @note It is not possible to kill threads in Linux kernel mode. This
* function will only send a SIGTERM signal, and it is the responsibility
* of the thread to check for the presence of this signal with
* signal_pending().
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalThreadKill (IxOsalThread * thread);
/**
* @ingroup IxOsal
*
* @brief Exits a running thread
*
* Terminates the calling thread
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - This function never returns
*/
PUBLIC void ixOsalThreadExit (void);
/**
* @ingroup IxOsal
*
* @brief Sets the priority of an existing thread
*
* @param thread - handle of the thread
* @param priority - new priority, between 0 and 255 (0 being the highest)
*
* Sets the thread priority
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalThreadPrioritySet (IxOsalThread * thread,
UINT32 priority);
/**
* @ingroup IxOsal
*
* @brief Suspends thread execution
*
* @param thread - handle of the thread
*
* Suspends the thread execution
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalThreadSuspend (IxOsalThread * thread);
/**
* @ingroup IxOsal
*
* @brief Resumes thread execution
*
* @param thread - handle of the thread
*
* Resumes the thread execution
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalThreadResume (IxOsalThread * thread);
/* ======================= Message Queues (IPC) ==========================
*
*/
/**
* @ingroup IxOsal
*
* @brief Creates a message queue
*
* @param queue - queue handle
* @param msgCount - maximum number of messages to hold in the queue
* @param msgLen - maximum length of each message, in bytes
*
* Creates a message queue of msgCount messages, each containing msgLen bytes
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalMessageQueueCreate (IxOsalMessageQueue * queue,
UINT32 msgCount, UINT32 msgLen);
/**
* @ingroup IxOsal
*
* @brief Deletes a message queue
*
* @param queue - queue handle
*
* Deletes a message queue
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalMessageQueueDelete (IxOsalMessageQueue * queue);
/**
* @ingroup IxOsal
*
* @brief Sends a message to a message queue
*
* @param queue - queue handle
* @param message - message to send
*
* Sends a message to the message queue. The message will be copied (at the
* configured size of the message) into the queue.
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalMessageQueueSend (IxOsalMessageQueue * queue,
UINT8 * message);
/**
* @ingroup IxOsal
*
* @brief Receives a message from a message queue
*
* @param queue - queue handle
* @param message - pointer to where the message should be copied to
*
* Retrieves the first message from the message queue
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalMessageQueueReceive (IxOsalMessageQueue * queue,
UINT8 * message);
/* ======================= Thread Synchronisation ========================
*
*/
/**
* @ingroup IxOsal
*
* @brief initializes a mutex
*
* @param mutex - mutex handle
*
* Initializes a mutex object
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalMutexInit (IxOsalMutex * mutex);
/**
* @ingroup IxOsal
*
* @brief locks a mutex
*
* @param mutex - mutex handle
* @param timeout - timeout in ms; IX_OSAL_WAIT_FOREVER (-1) to wait forever
* or IX_OSAL_WAIT_NONE to return immediately
*
* Locks a mutex object
*
* @li Reentrant: yes
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalMutexLock (IxOsalMutex * mutex, INT32 timeout);
/**
* @ingroup IxOsal
*
* @brief Unlocks a mutex
*
* @param mutex - mutex handle
*
* Unlocks a mutex object
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalMutexUnlock (IxOsalMutex * mutex);
/**
* @ingroup IxOsal
*
* @brief Non-blocking attempt to lock a mutex
*
* @param mutex - mutex handle
*
* Attempts to lock a mutex object, returning immediately with IX_SUCCESS if
* the lock was successful or IX_FAIL if the lock failed
*
* @li Reentrant: yes
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalMutexTryLock (IxOsalMutex * mutex);
/**
* @ingroup IxOsal
*
* @brief Destroys a mutex object
*
* @param mutex - mutex handle
* @param
*
* Destroys a mutex object; the caller should ensure that no thread is
* blocked on this mutex
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalMutexDestroy (IxOsalMutex * mutex);
/**
* @ingroup IxOsal
*
* @brief Initializes a fast mutex
*
* @param mutex - fast mutex handle
*
* Initializes a fast mutex object
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalFastMutexInit (IxOsalFastMutex * mutex);
/**
* @ingroup IxOsal
*
* @brief Non-blocking attempt to lock a fast mutex
*
* @param mutex - fast mutex handle
*
* Attempts to lock a fast mutex object, returning immediately with
* IX_SUCCESS if the lock was successful or IX_FAIL if the lock failed
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalFastMutexTryLock (IxOsalFastMutex * mutex);
/**
* @ingroup IxOsal
*
* @brief Unlocks a fast mutex
*
* @param mutex - fast mutex handle
*
* Unlocks a fast mutex object
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalFastMutexUnlock (IxOsalFastMutex * mutex);
/**
* @ingroup IxOsal
*
* @brief Destroys a fast mutex object
*
* @param mutex - fast mutex handle
*
* Destroys a fast mutex object
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalFastMutexDestroy (IxOsalFastMutex * mutex);
/**
* @ingroup IxOsal
*
* @brief Initializes a semaphore
*
* @param semaphore - semaphore handle
* @param value - initial semaphore value
*
* Initializes a semaphore object
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalSemaphoreInit (IxOsalSemaphore * semaphore,
UINT32 value);
/**
* @ingroup IxOsal
*
* @brief Posts to (increments) a semaphore
*
* @param semaphore - semaphore handle
*
* Increments a semaphore object
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalSemaphorePost (IxOsalSemaphore * semaphore);
/**
* @ingroup IxOsal
*
* @brief Waits on (decrements) a semaphore
*
* @param semaphore - semaphore handle
* @param timeout - timeout, in ms; IX_OSAL_WAIT_FOREVER (-1) if the thread
* is to block indefinitely or IX_OSAL_WAIT_NONE (0) if the thread is to
* return immediately even if the call fails
*
* Decrements a semaphore, blocking if the semaphore is
* unavailable (value is 0).
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalSemaphoreWait (IxOsalSemaphore * semaphore,
INT32 timeout);
/**
* @ingroup IxOsal
*
* @brief Non-blocking wait on semaphore
*
* @param semaphore - semaphore handle
*
* Decrements a semaphore, not blocking the calling thread if the semaphore
* is unavailable
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalSemaphoreTryWait (IxOsalSemaphore * semaphore);
/**
* @ingroup IxOsal
*
* @brief Gets semaphore value
*
* @param semaphore - semaphore handle
* @param value - location to store the semaphore value
*
* Retrieves the current value of a semaphore object
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalSemaphoreGetValue (IxOsalSemaphore * semaphore,
UINT32 * value);
/**
* @ingroup IxOsal
*
* @brief Destroys a semaphore object
*
* @param semaphore - semaphore handle
*
* Destroys a semaphore object; the caller should ensure that no thread is
* blocked on this semaphore
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalSemaphoreDestroy (IxOsalSemaphore * semaphore);
/**
* @ingroup IxOsal
*
* @brief Yields execution of current thread
*
* Yields the execution of the current thread
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - none
*/
PUBLIC void ixOsalYield (void);
/* ========================== Time functions ===========================
*
*/
/**
* @ingroup IxOsal
*
* @brief Yielding sleep for a number of milliseconds
*
* @param milliseconds - number of milliseconds to sleep
*
* The calling thread will sleep for the specified number of milliseconds.
* This sleep is yielding, hence other tasks will be scheduled by the
* operating system during the sleep period. Calling this function with an
* argument of 0 will place the thread at the end of the current scheduling
* loop.
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - none
*/
PUBLIC void ixOsalSleep (UINT32 milliseconds);
/**
* @ingroup IxOsal
*
* @brief Busy sleep for a number of microseconds
*
* @param microseconds - number of microseconds to sleep
*
* Sleeps for the specified number of microseconds, without explicitly
* yielding thread execution to the OS scheduler
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - none
*/
PUBLIC void ixOsalBusySleep (UINT32 microseconds);
/**
* @ingroup IxOsal
*
* @brief XXX
*
* Retrieves the current timestamp
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - The current timestamp
*
* @note The implementation of this function is platform-specific. Not
* all the platforms provide a high-resolution timestamp counter.
*/
PUBLIC UINT32 ixOsalTimestampGet (void);
/**
* @ingroup IxOsal
*
* @brief Resolution of the timestamp counter
*
* Retrieves the resolution (frequency) of the timestamp counter.
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - The resolution of the timestamp counter
*
* @note The implementation of this function is platform-specific. Not all
* the platforms provide a high-resolution timestamp counter.
*/
PUBLIC UINT32 ixOsalTimestampResolutionGet (void);
/**
* @ingroup IxOsal
*
* @brief System clock rate, in ticks
*
* Retrieves the resolution (number of ticks per second) of the system clock
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - The system clock rate
*
* @note The implementation of this function is platform and OS-specific.
* The system clock rate is not always available - e.g. Linux does not
* provide this information in user mode
*/
PUBLIC UINT32 ixOsalSysClockRateGet (void);
/**
* @ingroup IxOsal
*
* @brief Current system time
*
* @param tv - pointer to an IxOsalTimeval structure to store the current
* time in
*
* Retrieves the current system time (real-time)
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - none
*
* @note The implementation of this function is platform-specific. Not all
* platforms have a real-time clock.
*/
PUBLIC void ixOsalTimeGet (IxOsalTimeval * tv);
/* Internal function to convert timer val to ticks.
* NOTE - This should not be called by the user.
* Use the macro IX_OSAL_TIMEVAL_TO_TICKS
* OS-independent, implemented in framework.
*/
PUBLIC UINT32 ixOsalTimevalToTicks (IxOsalTimeval tv);
/**
* @ingroup IxOsal
*
* @brief Converts ixOsalTimeVal into ticks
*
* @param tv - an IxOsalTimeval structure
*
* Converts an IxOsalTimeval structure into OS ticks
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - Corresponding number of ticks
*
* Note: This function is OS-independent. Implemented by core.
*/
#define IX_OSAL_TIMEVAL_TO_TICKS(tv) ixOsalTimevalToTicks(tv)
/* Internal function to convert ticks to timer val
* NOTE - This should not be called by the user.
* Use the macro IX_OSAL_TICKS_TO_TIMEVAL
*/
PUBLIC void ixOsalTicksToTimeval (UINT32 ticks, IxOsalTimeval * pTv);
/**
* @ingroup IxOsal
*
* @brief Converts ticks into ixOsalTimeVal
*
* @param ticks - number of ticks
* @param pTv - pointer to the destination structure
*
* Converts the specified number of ticks into an IxOsalTimeval structure
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - Corresponding IxOsalTimeval structure
* Note: This function is OS-independent. Implemented by core.
*/
#define IX_OSAL_TICKS_TO_TIMEVAL(ticks, pTv) \
ixOsalTicksToTimeval(ticks, pTv)
/**
* @ingroup IxOsal
*
* @brief Converts ixOsalTimeVal to milliseconds
*
* @param tv - IxOsalTimeval structure to convert
*
* Converts an IxOsalTimeval structure into milliseconds
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - Corresponding number of milliseconds
* Note: This function is OS-independent. Implemented by core.
*/
#define IX_OSAL_TIMEVAL_TO_MS(tv) ((tv.secs * 1000) + (tv.nsecs / 1000000))
/**
* @ingroup IxOsal
*
* @brief Converts milliseconds to IxOsalTimeval
*
* @param milliseconds - number of milliseconds to convert
* @param pTv - pointer to the destination structure
*
* Converts a millisecond value into an IxOsalTimeval structure
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - Corresponding IxOsalTimeval structure
* Note: This function is OS-independent. Implemented by core.
*/
#define IX_OSAL_MS_TO_TIMEVAL(milliseconds, pTv) \
((IxOsalTimeval *) pTv)->secs = milliseconds / 1000; \
((IxOsalTimeval *) pTv)->nsecs = (milliseconds % 1000) * 1000000
/**
* @ingroup IxOsal
*
* @brief "equal" comparison for IxOsalTimeval
*
* @param tvA, tvB - IxOsalTimeval structures to compare
*
* Compares two IxOsalTimeval structures for equality
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - TRUE if the structures are equal
* - FALSE otherwise
* Note: This function is OS-independant
*/
#define IX_OSAL_TIME_EQ(tvA, tvB) \
((tvA).secs == (tvB).secs && (tvA).nsecs == (tvB).nsecs)
/**
* @ingroup IxOsal
*
* @brief "less than" comparison for IxOsalTimeval
*
* @param tvA, tvB - IxOsalTimeval structures to compare
*
* Compares two IxOsalTimeval structures to determine if the first one is
* less than the second one
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - TRUE if tvA < tvB
* - FALSE otherwise
* Note: This function is OS-independent. Implemented by core.
*/
#define IX_OSAL_TIME_LT(tvA,tvB) \
((tvA).secs < (tvB).secs || \
((tvA).secs == (tvB).secs && (tvA).nsecs < (tvB).nsecs))
/**
* @ingroup IxOsal
*
* @brief "greater than" comparison for IxOsalTimeval
*
* @param tvA, tvB - IxOsalTimeval structures to compare
*
* Compares two IxOsalTimeval structures to determine if the first one is
* greater than the second one
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - TRUE if tvA > tvB
* - FALSE otherwise
* Note: This function is OS-independent.
*/
#define IX_OSAL_TIME_GT(tvA, tvB) \
((tvA).secs > (tvB).secs || \
((tvA).secs == (tvB).secs && (tvA).nsecs > (tvB).nsecs))
/**
* @ingroup IxOsal
*
* @brief "add" operator for IxOsalTimeval
*
* @param tvA, tvB - IxOsalTimeval structures to add
*
* Adds the second IxOsalTimevalStruct to the first one (equivalent to
* tvA += tvB)
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - none
* Note: This function is OS-independent.
*/
#define IX_OSAL_TIME_ADD(tvA, tvB) \
(tvA).secs += (tvB).secs; \
(tvA).nsecs += (tvB).nsecs; \
if ((tvA).nsecs >= IX_OSAL_BILLION) \
{ \
(tvA).secs++; \
(tvA).nsecs -= IX_OSAL_BILLION; }
/**
* @ingroup IxOsal
*
* @brief "subtract" operator for IxOsalTimeval
*
* @param tvA, tvB - IxOsalTimeval structures to subtract
*
* Subtracts the second IxOsalTimevalStruct from the first one (equivalent
* to tvA -= tvB)
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - none
* Note: This function is OS-independent. Implemented by core.
*/
#define IX_OSAL_TIME_SUB(tvA, tvB) \
if ((tvA).nsecs >= (tvB).nsecs) \
{ \
(tvA).secs -= (tvB).secs; \
(tvA).nsecs -= (tvB).nsecs; \
} \
else \
{ \
(tvA).secs -= ((tvB).secs + 1); \
(tvA).nsecs += IX_OSAL_BILLION - (tvB).nsecs; \
}
/* ============================= Logging ==============================
*
*/
/**
* @ingroup IxOsal
*
* @brief Interrupt-safe logging function
*
* @param level - identifier prefix for the message
* @param device - output device
* @param format - message format, in a printf format
* @param ... - up to 6 arguments to be printed
*
* IRQ-safe logging function, similar to printf. Accepts up to 6 arguments
* to print (excluding the level, device and the format). This function will
* actually display the message only if the level is lower than the current
* verbosity level or if the IX_OSAL_LOG_USER level is used. An output device
* must be specified (see IxOsalTypes.h).
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - Beside the exceptions documented in the note below, the returned
* value is the number of printed characters, or -1 if the parameters are
* incorrect (NULL format, unknown output device)
*
* @note The exceptions to the return value are:
* VxWorks: The return value is 32 if the specified level is 1 and 64
* if the specified level is greater than 1 and less or equal than 9.
* WinCE: If compiled for EBOOT then the return value is always 0.
*
* @note The given print format should take into account the specified
* output device. IX_OSAL_STDOUT supports all the usual print formats,
* however a custom hex display specified by IX_OSAL_HEX would support
* only a fixed number of hexadecimal digits.
*/
PUBLIC INT32 ixOsalLog (IxOsalLogLevel level,
IxOsalLogDevice device,
char *format,
int arg1,
int arg2, int arg3, int arg4, int arg5, int arg6);
/**
* @ingroup IxOsal
*
* @brief sets the current logging verbosity level
*
* @param level - new log verbosity level
*
* Sets the log verbosity level. The default value is IX_OSAL_LOG_ERROR.
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* @return - Old log verbosity level
*/
PUBLIC UINT32 ixOsalLogLevelSet (UINT32 level);
/* ============================= Logging ==============================
*
*/
/**
* @ingroup IxOsal
*
* @brief Schedules a repeating timer
*
* @param timer - handle of the timer object
* @param period - timer trigger period, in milliseconds
* @param priority - timer priority (0 being the highest)
* @param callback - user callback to invoke when the timer triggers
* @param param - custom parameter passed to the callback
*
* Schedules a timer to be called every period milliseconds. The timer
* will invoke the specified callback function possibly in interrupt
* context, passing the given parameter. If several timers trigger at the
* same time contention issues are dealt according to the specified timer
* priorities.
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalRepeatingTimerSchedule (IxOsalTimer * timer,
UINT32 period,
UINT32 priority,
IxOsalVoidFnVoidPtr callback,
void *param);
/**
* @ingroup IxOsal
*
* @brief Schedules a single-shot timer
*
* @param timer - handle of the timer object
* @param period - timer trigger period, in milliseconds
* @param priority - timer priority (0 being the highest)
* @param callback - user callback to invoke when the timer triggers
* @param param - custom parameter passed to the callback
*
* Schedules a timer to be called after period milliseconds. The timer
* will cease to function past its first trigger. The timer will invoke
* the specified callback function, possibly in interrupt context, passing
* the given parameter. If several timers trigger at the same time contention
* issues are dealt according to the specified timer priorities.
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS
ixOsalSingleShotTimerSchedule (IxOsalTimer * timer,
UINT32 period,
UINT32 priority,
IxOsalVoidFnVoidPtr callback, void *param);
/**
* @ingroup IxOsal
*
* @brief Cancels a running timer
*
* @param timer - handle of the timer object
*
* Cancels a single-shot or repeating timer.
*
* @li Reentrant: no
* @li IRQ safe: yes
*
* @return - IX_SUCCESS/IX_FAIL
*/
PUBLIC IX_STATUS ixOsalTimerCancel (IxOsalTimer * timer);
/**
* @ingroup IxOsal
*
* @brief displays all the running timers
*
* Displays a list with all the running timers and their parameters (handle,
* period, type, priority, callback and user parameter)
*
* @li Reentrant: no
* @li IRQ safe: no
*
* @return - none
*/
PUBLIC void ixOsalTimersShow (void);
/* ============================= Version ==============================
*
*/
/**
* @ingroup IxOsal
*
* @brief provides the name of the Operating System running
*
* @param osName - Pointer to a NULL-terminated string of characters
* that holds the name of the OS running.
* This is both an input and an ouput parameter
* @param maxSize - Input parameter that defines the maximum number of
* bytes that can be stored in osName
*
* Returns a string of characters that describe the Operating System name
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* return - IX_SUCCESS for successful retrieval
* - IX_FAIL if (osType == NULL | maxSize =< 0)
*/
PUBLIC IX_STATUS ixOsalOsNameGet (INT8* osName, INT32 maxSize);
/**
* @ingroup IxOsal
*
* @brief provides the version of the Operating System running
*
* @param osVersion - Pointer to a NULL terminated string of characters
* that holds the version of the OS running.
* This is both an input and an ouput parameter
* @param maxSize - Input parameter that defines the maximum number of
* bytes that can be stored in osVersion
*
* Returns a string of characters that describe the Operating System's version
*
* @li Reentrant: yes
* @li IRQ safe: yes
*
* return - IX_SUCCESS for successful retrieval
* - IX_FAIL if (osVersion == NULL | maxSize =< 0)
*/
PUBLIC IX_STATUS ixOsalOsVersionGet(INT8* osVersion, INT32 maxSize);
/**
* @} IxOsal
*/
#endif /* IxOsal_H */
|