硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2486|回复: 5
收起左侧

[ThreadX全家桶] ThreadX GUIX用于其它RTOS的接口文件gx_system_rtos_bind.c,默认还提供了uCOS-II和III的移植代码

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2020-9-15 10:38:45 | 显示全部楼层 |阅读模式



下面的代码里面uCOS-II和uCOS-III都提供了:

  1. /**************************************************************************/
  2. /*                                                                        */
  3. /*       Copyright (c) Microsoft Corporation. All rights reserved.        */
  4. /*                                                                        */
  5. /*       This software is licensed under the Microsoft Software License   */
  6. /*       Terms for Microsoft Azure RTOS. Full text of the license can be  */
  7. /*       found in the LICENSE file at https://aka.ms/AzureRTOS_EULA       */
  8. /*       and in the root directory of this software.                      */
  9. /*                                                                        */
  10. /**************************************************************************/


  11. /**************************************************************************/
  12. /**************************************************************************/
  13. /**                                                                       */
  14. /** GUIX Component                                                        */
  15. /**                                                                       */
  16. /**   System Management (System)                                          */
  17. /**                                                                       */
  18. /**************************************************************************/

  19. //#define GX_SOURCE_CODE

  20. /* Include necessary system files.  */

  21. #include "gx_api.h"
  22. #include "gx_system.h"
  23. #include "gx_system_rtos_bind.h"


  24. /**************************************************************************/
  25. /*                                                                        */
  26. /*  FUNCTION                                               RELEASE        */
  27. /*                                                                        */
  28. /*    _gx_system_rtos_bind                                PORTABLE C      */
  29. /*                                                           6.0          */
  30. /*  AUTHOR                                                                */
  31. /*                                                                        */
  32. /*    Kenneth Maxwell, Microsoft Corporation                              */
  33. /*                                                                        */
  34. /*  DESCRIPTION                                                           */
  35. /*                                                                        */
  36. /*    This file contains a small set of shell functions used to bind GUIX */
  37. /*    to a generic RTOS. GUIX is by default configured to run with the    */
  38. /*    ThreadX RTOS, but you can port to another RTOS by defining the      */
  39. /*    pre-processor directive GX_DISABLE_THREADX_BINDING and completing   */
  40. /*    the implementation of the functions found in this file.             */
  41. /*    Refer to the GUIX User Guide for more information.                  */
  42. /*                                                                        */
  43. /*  INPUT                                                                 */
  44. /*                                                                        */
  45. /*    Refer to GUIX User Guide                                            */
  46. /*                                                                        */
  47. /*  OUTPUT                                                                */
  48. /*                                                                        */
  49. /*    Refer to GUIX User Guide                                            */
  50. /*                                                                        */
  51. /*  CALLS                                                                 */
  52. /*                                                                        */
  53. /*    Refer to GUIX User Guide                                            */
  54. /*                                                                        */
  55. /*  CALLED BY                                                             */
  56. /*                                                                        */
  57. /*    GUIX system serives                                                 */
  58. /*                                                                        */
  59. /*  RELEASE HISTORY                                                       */
  60. /*                                                                        */
  61. /*    DATE              NAME                      DESCRIPTION             */
  62. /*                                                                        */
  63. /*  05-19-2020     Kenneth Maxwell          Initial Version 6.0           */
  64. /*                                                                        */
  65. /**************************************************************************/

  66. #ifndef GX_THREADX_BINDING

  67. /* This is an example of a generic RTOS binding. We have #ifdefed this code out
  68.    of the GUIX library build, so that the user attempting to port to a new RTOS
  69.    will intentionally observe a series of linker errors. These functions need to
  70.    be implemented in a way that works correctly with the target RTOS.
  71. */

  72. #if defined(GUIX_BINDING_UCOS_III)

  73. #include "os.h"

  74. #ifndef OS_CFG_TICK_RATE_HZ
  75. #define OS_CFG_TICK_RATE_HZ 100
  76. #endif

  77. #define GX_TIMER_TASK_PRIORITY   (GX_SYSTEM_THREAD_PRIORITY + 1)
  78. #define GX_TIMER_TASK_STACK_SIZE 512
  79. void guix_timer_task_entry(void *);

  80. /* a few global status variables */
  81. GX_BOOL guix_timer_event_pending;

  82. /* define stack space for GUIX task */
  83. CPU_STK guix_task_stack[GX_THREAD_STACK_SIZE];

  84. /* define stack space for timer task */
  85. CPU_STK guix_timer_task_stack[GX_TIMER_TASK_STACK_SIZE];

  86. /* define semaphore for lock/unlock macros */
  87. OS_MUTEX guix_system_lock_mutex;

  88. OS_ERR uc_error;
  89. OS_TCB guix_tcb;
  90. OS_TCB guix_timer_tcb;

  91. /* a custom event structure, to hold event and linked list */

  92. typedef struct guix_linked_event_struct
  93. {
  94.     GX_EVENT                         event_data;        /* the GUIX event structure */
  95.     struct guix_linked_event_struct *next;              /* add link member          */
  96. } GUIX_LINKED_EVENT;


  97. /* a custom fifo event queue structure */

  98. typedef struct guix_event_queue_struct
  99. {
  100.     GUIX_LINKED_EVENT *first;           /* first (oldest) event in fifo */
  101.     GUIX_LINKED_EVENT *last;            /* last (newest) event in fifo  */
  102.     GUIX_LINKED_EVENT *free;            /* linked list of free events   */
  103.     GUIX_LINKED_EVENT *free_end;        /* end of the free list         */
  104.     OS_SEM             count_sem;       /* number of queued events      */
  105.     OS_MUTEX           lock;            /* lock to protect queue update */
  106. } GUIX_EVENT_QUEUE;

  107. /* an array of GX_EVENTs used to implement fifo queue */

  108. GUIX_LINKED_EVENT guix_event_array[GX_MAX_QUEUE_EVENTS];
  109. GUIX_EVENT_QUEUE  guix_event_queue;

  110. /* rtos initialize: perform any setup that needs to be done before the GUIX task runs here */
  111. VOID   gx_generic_rtos_initialize(VOID)
  112. {
  113. int Loop;
  114. GUIX_LINKED_EVENT *current;

  115.     guix_timer_event_pending = GX_FALSE;
  116.     OSMutexCreate(&guix_system_lock_mutex, "gx_system_lock", &uc_error);

  117.     /* initialize a custom fifo queue structure */

  118.     guix_event_queue.first = GX_NULL;
  119.     guix_event_queue.last = GX_NULL;
  120.     guix_event_queue.free = guix_event_array;

  121.     current = guix_event_queue.free;

  122.     /* link all the structures together */
  123.     for (Loop = 0; Loop < GX_MAX_QUEUE_EVENTS - 1; Loop++)
  124.     {
  125.         current -> next = (current + 1);
  126.         current = current -> next;
  127.     }
  128.     current -> next = GX_NULL;                /* terminate the list */
  129.     guix_event_queue.free_end = current;

  130.     /* create mutex for lock access to this queue */
  131.     OSMutexCreate(&guix_event_queue.lock, "gx_queue_lock", &uc_error);

  132.     /* create counting semaphore to track queue entries */
  133.     OSSemCreate(&guix_event_queue.count_sem, "gx_queue_count", 0, &uc_error);
  134. }

  135. VOID (*gx_system_thread_entry)(ULONG);

  136. // A small shell function to convert the void * arg expected by uC/OS to
  137. // a ULONG parameter expected by GUIX thread entry
  138. void gx_system_thread_entry_shell(void *parg)
  139. {
  140.     gx_system_thread_entry((ULONG) parg);
  141. }

  142. /* thread_start: start the GUIX thread running. */
  143. UINT   gx_generic_thread_start(VOID(*guix_thread_entry)(ULONG))
  144. {

  145.     /* save the GUIX system thread entry function pointer */
  146.     gx_system_thread_entry = guix_thread_entry;

  147.     /* create the main GUIX task */

  148.     OSTaskCreate(&guix_tcb, "guix_task",
  149.                  gx_system_thread_entry_shell,
  150.                  GX_NULL,
  151.                  GX_SYSTEM_THREAD_PRIORITY,
  152.                  &guix_task_stack[0],
  153.                  GX_THREAD_STACK_SIZE - 1,
  154.                  GX_THREAD_STACK_SIZE,
  155.                  0, 0, GX_NULL, OS_OPT_TASK_NONE, &uc_error);

  156.     /* create a simple task to generate timer events into GUIX */
  157.     OSTaskCreate(&guix_timer_tcb, "guix_timer_task",
  158.                  guix_timer_task_entry,
  159.                  GX_NULL,
  160.                  GX_TIMER_TASK_PRIORITY,
  161.                  &guix_timer_task_stack[0],
  162.                  GX_TIMER_TASK_STACK_SIZE -1,
  163.                  GX_TIMER_TASK_STACK_SIZE,
  164.                  0, 0, GX_NULL, OS_OPT_TASK_NONE, &uc_error);

  165.     /* suspend the timer task until needed */
  166.     OSTaskSuspend(&guix_timer_tcb, &uc_error);
  167.     return GX_SUCCESS;
  168. }

  169. /* event_post: push an event into the fifo event queue */
  170. UINT   gx_generic_event_post(GX_EVENT *event_ptr)
  171. {
  172. GUIX_LINKED_EVENT *linked_event;

  173.     /* lock down the guix event queue */
  174.     OSMutexPend(&guix_event_queue.lock, 0, OS_OPT_PEND_BLOCKING, NULL, &uc_error);

  175.     /* grab a free event slot */
  176.     if (!guix_event_queue.free)
  177.     {
  178.         /* there are no free events, return failure */
  179.         OSMutexPost(&guix_event_queue.lock, OS_OPT_POST_NONE, &uc_error);
  180.         return GX_FAILURE;
  181.     }

  182.     linked_event = guix_event_queue.free;
  183.     guix_event_queue.free = guix_event_queue.free->next;

  184.     if (!guix_event_queue.free)
  185.     {
  186.         guix_event_queue.free_end = GX_NULL;
  187.     }

  188.     /* copy the event data into this slot */
  189.     linked_event -> event_data = *event_ptr;
  190.     linked_event -> next = GX_NULL;

  191.     /* insert this event into fifo queue */
  192.     if (guix_event_queue.last)
  193.     {
  194.         guix_event_queue.last -> next = linked_event;
  195.     }
  196.     else
  197.     {
  198.         guix_event_queue.first = linked_event;
  199.     }
  200.     guix_event_queue.last = linked_event;

  201.     /* Unlock the guix queue */
  202.     OSMutexPost(&guix_event_queue.lock, OS_OPT_POST_NONE, &uc_error);

  203.     /* increment event count */
  204.     OSSemPost(&guix_event_queue.count_sem, OS_OPT_POST_ALL, &uc_error);
  205.     return GX_SUCCESS;
  206. }

  207. /* event_fold: update existing matching event, otherwise post new event */
  208. UINT   gx_generic_event_fold(GX_EVENT *event_ptr)
  209. {
  210. GUIX_LINKED_EVENT *pTest;

  211.     /* Lock down the guix queue */

  212.     OSMutexPend(&guix_event_queue.lock, 0, OS_OPT_PEND_BLOCKING, NULL, &uc_error);

  213.     // see if the same event is already in the queue:
  214.     pTest = guix_event_queue.first;

  215.     while (pTest)
  216.     {
  217.         if (pTest -> event_data.gx_event_type == event_ptr -> gx_event_type)
  218.         {
  219.             /* found matching event, update it and return */
  220.             pTest -> event_data.gx_event_payload.gx_event_ulongdata = event_ptr -> gx_event_payload.gx_event_ulongdata;
  221.             OSMutexPost(&guix_event_queue.lock, OS_OPT_POST_NONE, &uc_error);
  222.             return GX_SUCCESS;
  223.         }
  224.         pTest = pTest -> next;
  225.     }

  226.     /* did not find a match, push new event */

  227.     OSMutexPost(&guix_event_queue.lock, OS_OPT_POST_NONE, &uc_error);
  228.     gx_generic_event_post(event_ptr);
  229.     return GX_SUCCESS;
  230. }


  231. /* event_pop: pop oldest event from fifo queue, block if wait and no events exist */
  232. UINT   gx_generic_event_pop(GX_EVENT *put_event, GX_BOOL wait)
  233. {
  234.     if (!wait)
  235.     {
  236.         if (guix_event_queue.first == GX_NULL)
  237.         {
  238.             /* the queue is empty, just return */
  239.             return GX_FAILURE;
  240.         }
  241.     }

  242.     /* wait for an event to arrive in queue */
  243.     OSSemPend(&guix_event_queue.count_sem, 0, OS_OPT_PEND_BLOCKING, NULL, &uc_error);

  244.     /* lock down the queue */
  245.     OSMutexPend(&guix_event_queue.lock, 0, OS_OPT_PEND_BLOCKING, NULL, &uc_error);

  246.     /* copy the event into destination */
  247.     *put_event = guix_event_queue.first -> event_data;

  248.     /* link this event holder back into free list */
  249.     if (guix_event_queue.free_end)
  250.     {
  251.         guix_event_queue.free_end -> next = guix_event_queue.first;
  252.     }
  253.     else
  254.     {
  255.         guix_event_queue.free = guix_event_queue.first;
  256.     }

  257.     guix_event_queue.free_end = guix_event_queue.first;
  258.     guix_event_queue.first = guix_event_queue.first -> next;
  259.     guix_event_queue.free_end -> next = GX_NULL;

  260.     if (!guix_event_queue.first)
  261.     {
  262.         guix_event_queue.last = GX_NULL;
  263.     }

  264.     /* check for popping out a timer event */
  265.     if (put_event -> gx_event_type == GX_EVENT_TIMER)
  266.     {
  267.         guix_timer_event_pending = GX_FALSE;
  268.     }

  269.     /* unlock the queue */
  270.     OSMutexPost(&guix_event_queue.lock, OS_OPT_POST_NONE, &uc_error);
  271.     return GX_SUCCESS;
  272. }

  273. /* event_purge: delete events targetted to particular widget */
  274. VOID   gx_generic_event_purge(GX_WIDGET *target)
  275. {
  276. GX_BOOL Purge;
  277. GUIX_LINKED_EVENT *pTest;

  278.     /* Lock down the guix queue */

  279.     OSMutexPend(&guix_event_queue.lock, 0, OS_OPT_PEND_BLOCKING, NULL, &uc_error);

  280.     // look for events targetted to widget or widget children:
  281.     pTest = guix_event_queue.first;

  282.     while (pTest)
  283.     {
  284.         Purge = GX_FALSE;

  285.         if (pTest ->event_data.gx_event_target)
  286.         {
  287.             if (pTest -> event_data.gx_event_target == target)
  288.             {
  289.                 Purge = GX_TRUE;
  290.             }
  291.             else
  292.             {
  293.                 gx_widget_child_detect(target, pTest->event_data.gx_event_target, &Purge);
  294.             }
  295.             if (Purge)
  296.             {
  297.                 pTest ->event_data.gx_event_target = GX_NULL;
  298.                 pTest->event_data.gx_event_type = 0;
  299.             }
  300.         }
  301.         pTest = pTest -> next;
  302.     }

  303.     OSMutexPost(&guix_event_queue.lock, OS_OPT_POST_NONE, &uc_error);
  304. }

  305. /* start the RTOS timer */
  306. VOID   gx_generic_timer_start(VOID)
  307. {
  308.     OSTaskResume(&guix_timer_tcb, &uc_error);
  309. }

  310. /* stop the RTOS timer */
  311. VOID   gx_generic_timer_stop(VOID)
  312. {
  313.     OSTaskSuspend(&guix_timer_tcb, &uc_error);
  314. }

  315. /* lock the system protection mutex */
  316. VOID   gx_generic_system_mutex_lock(VOID)
  317. {
  318.     OSMutexPend(&guix_system_lock_mutex, 0, OS_OPT_PEND_BLOCKING, NULL, &uc_error);

  319. }

  320. /* unlock system protection mutex */
  321. VOID   gx_generic_system_mutex_unlock(VOID)
  322. {
  323.     OSMutexPost(&guix_system_lock_mutex, OS_OPT_POST_NONE, &uc_error);
  324. }

  325. /* return number of low-level system timer ticks. Used for pen speed caculations */
  326. ULONG  gx_generic_system_time_get(VOID)
  327. {
  328.     return((ULONG)OSTimeGet(&uc_error));
  329. }

  330. /* thread_identify: return current thread identifier, cast as VOID * */
  331. VOID  *gx_generic_thread_identify(VOID)
  332. {
  333.     return((VOID *)OSTCBCurPtr);
  334. }

  335. /* a simple task to drive the GUIX timer mechanism */
  336. void guix_timer_task_entry(void *unused)
  337. {
  338. int TickCount = OS_CFG_TICK_RATE_HZ / GX_TICKS_SECOND;

  339.     if (TickCount <= 0)
  340.     {
  341.         TickCount = 1;
  342.     }

  343.     while (1)
  344.     {
  345.         OSTimeDly(TickCount, OS_OPT_TIME_DLY, &uc_error);

  346.         /* prevent sending timer events faster than they can be processed */
  347.         if (!guix_timer_event_pending)
  348.         {
  349.             guix_timer_event_pending = GX_TRUE;
  350.             _gx_system_timer_expiration(0);
  351.         }
  352.     }
  353. }

  354. VOID gx_generic_time_delay(int ticks)
  355. {
  356.     OSTimeDly(ticks, OS_OPT_TIME_DLY, &uc_error);
  357. }


  358. #endif  /* Binding for UCOS-III enabled */

  359. #if defined(GUIX_BINDING_UCOS_II)

  360. #include "ucos_ii.h"

  361. #define TIMER_TASK_PRIORITY   (GX_SYSTEM_THREAD_PRIORITY + 1)
  362. #define TIMER_TASK_STACK_SIZE 512
  363. void guix_timer_task_entry(void *);

  364. /* a few global status variables */
  365. GX_BOOL guix_timer_event_pending;
  366. INT8U   guix_uc_err = 0;

  367. /* define stack space for GUIX task */
  368. OS_STK guix_task_stack[GX_THREAD_STACK_SIZE];
  369. OS_STK guix_task_stack[GX_THREAD_STACK_SIZE];

  370. /* define stack space for timer task */
  371. OS_STK guix_timer_task_stack[TIMER_TASK_STACK_SIZE];

  372. /* define semaphore for lock/unlock macros */
  373. OS_EVENT *guix_system_lock_semaphore;

  374. /* a custom event structure, to hold event and linked list */

  375. typedef struct guix_linked_event_struct
  376. {
  377.     GX_EVENT                         event_data;        /* the GUIX event structure */
  378.     struct guix_linked_event_struct *next;              /* add link member          */
  379. } GUIX_LINKED_EVENT;


  380. /* a custom fifo event queue structure */

  381. typedef struct guix_event_queue_struct
  382. {
  383.     GUIX_LINKED_EVENT *first;           /* first (oldest) event in fifo */
  384.     GUIX_LINKED_EVENT *last;            /* last (newest) event in fifo  */
  385.     GUIX_LINKED_EVENT *free;            /* linked list of free events   */
  386.     GUIX_LINKED_EVENT *free_end;        /* end of the free list         */
  387.     OS_EVENT          *count_sem;       /* number of queued events      */
  388.     OS_EVENT          *lock_sem;        /* lock to protect queue update */
  389. } GUIX_EVENT_QUEUE;

  390. /* an array of GX_EVENTs used to implement fifo queue */

  391. GUIX_LINKED_EVENT guix_event_array[GX_MAX_QUEUE_EVENTS];
  392. GUIX_EVENT_QUEUE  guix_event_queue;

  393. /* rtos initialize: perform any setup that needs to be done before the GUIX task runs here */
  394. VOID   gx_generic_rtos_initialize(VOID)
  395. {
  396. int Loop;
  397. GUIX_LINKED_EVENT *current;

  398.     guix_timer_event_pending = GX_FALSE;
  399.     guix_system_lock_semaphore = OSSemCreate(1);

  400.     /* initialize a custom fifo queue structure */

  401.     guix_event_queue.first = GX_NULL;
  402.     guix_event_queue.last = GX_NULL;
  403.     guix_event_queue.free = guix_event_array;

  404.     current = guix_event_queue.free;

  405.     /* link all the structures together */
  406.     for (Loop = 0; Loop < GX_MAX_QUEUE_EVENTS - 1; Loop++)
  407.     {
  408.         current -> next = (current + 1);
  409.         current = current -> next;
  410.     }
  411.     current -> next = GX_NULL;                /* terminate the list */
  412.     guix_event_queue.free_end = current;

  413.     /* create mutex for lock access to this queue */
  414.     guix_event_queue.lock_sem = OSSemCreate(1);

  415.     /* create counting semaphore to track queue entries */
  416.     guix_event_queue.count_sem = OSSemCreate(0);
  417. }

  418. /* A variable to store GUIX thread entry function pointer */
  419. VOID (*gx_thread_entry)(ULONG);

  420. /* a simple shell function to convert the UCOS (void *)
  421.    parameter to the GUIX ULONG param type. */
  422. void guix_thread_entry_shell(void *ptr)
  423. {
  424.     gx_thread_entry((ULONG) ptr);
  425. }

  426. /* thread_start: start the GUIX thread running. */
  427. UINT   gx_generic_thread_start(VOID(*guix_thread_entry)(ULONG))
  428. {
  429.     /* save pointer to GUIX thread entry function */
  430.     gx_thread_entry = guix_thread_entry;

  431.     /* create the main GUIX task */
  432.     OSTaskCreate(guix_thread_entry_shell, (void *)0,
  433.                  &guix_task_stack[GX_THREAD_STACK_SIZE - 1], GX_SYSTEM_THREAD_PRIORITY);

  434.     /* create a simple task to generate timer events into GUIX */
  435.     OSTaskCreate(guix_timer_task_entry, (void *)0,
  436.                  &guix_timer_task_stack[TIMER_TASK_STACK_SIZE - 1], TIMER_TASK_PRIORITY);

  437.     /* suspend the timer task until needed */
  438.     OSTaskSuspend(TIMER_TASK_PRIORITY);
  439.     return GX_SUCCESS;
  440. }

  441. /* event_post: push an event into the fifo event queue */
  442. UINT   gx_generic_event_post(GX_EVENT *event_ptr)
  443. {
  444. GUIX_LINKED_EVENT *linked_event;

  445.     /* lock down the guix event queue */
  446.     OSSemPend(guix_event_queue.lock_sem, 0, &guix_uc_err);

  447.     /* grab a free event slot */
  448.     if (!guix_event_queue.free)
  449.     {
  450.         /* there are no free events, return failure */
  451.         OSSemPost(guix_event_queue.lock_sem);
  452.         return GX_FAILURE;
  453.     }

  454.     linked_event = guix_event_queue.free;
  455.     guix_event_queue.free = guix_event_queue.free->next;

  456.     if (!guix_event_queue.free)
  457.     {
  458.         guix_event_queue.free_end = GX_NULL;
  459.     }

  460.     /* copy the event data into this slot */
  461.     linked_event -> event_data = *event_ptr;
  462.     linked_event -> next = GX_NULL;

  463.     /* insert this event into fifo queue */
  464.     if (guix_event_queue.last)
  465.     {
  466.         guix_event_queue.last -> next = linked_event;
  467.     }
  468.     else
  469.     {
  470.         guix_event_queue.first = linked_event;
  471.     }
  472.     guix_event_queue.last = linked_event;

  473.     /* Unlock the guix queue */
  474.     OSSemPost(guix_event_queue.lock_sem);

  475.     /* increment event count */
  476.     OSSemPost(guix_event_queue.count_sem);
  477.     return GX_SUCCESS;
  478. }

  479. /* event_fold: update existing matching event, otherwise post new event */
  480. UINT   gx_generic_event_fold(GX_EVENT *event_ptr)
  481. {
  482. GUIX_LINKED_EVENT *pTest;

  483.     /* Lock down the guix queue */

  484.     OSSemPend(guix_event_queue.lock_sem, 0, &guix_uc_err);

  485.     // see if the same event is already in the queue:
  486.     pTest = guix_event_queue.first;

  487.     while (pTest)
  488.     {
  489.         if (pTest -> event_data.gx_event_type == event_ptr -> gx_event_type)
  490.         {
  491.             /* found matching event, update it and return */
  492.             pTest -> event_data.gx_event_payload.gx_event_ulongdata = event_ptr -> gx_event_payload.gx_event_ulongdata;
  493.             OSSemPost(guix_event_queue.lock_sem);
  494.             return GX_SUCCESS;
  495.         }
  496.         pTest = pTest -> next;
  497.     }

  498.     /* did not find a match, push new event */

  499.     OSSemPost(guix_event_queue.lock_sem);
  500.     gx_generic_event_post(event_ptr);
  501.     return GX_SUCCESS;
  502. }


  503. /* event_pop: pop oldest event from fifo queue, block if wait and no events exist */
  504. UINT   gx_generic_event_pop(GX_EVENT *put_event, GX_BOOL wait)
  505. {
  506.     if (!wait)
  507.     {
  508.         if (guix_event_queue.first == GX_NULL)
  509.         {
  510.             /* the queue is empty, just return */
  511.             OSSemPost(guix_event_queue.lock_sem);
  512.             return GX_FAILURE;
  513.         }
  514.     }

  515.     /* wait for an event to arrive in queue */
  516.     OSSemPend(guix_event_queue.count_sem, 0, &guix_uc_err);

  517.     /* lock down the queue */
  518.     OSSemPend(guix_event_queue.lock_sem, 0, &guix_uc_err);

  519.     /* copy the event into destination */
  520.     *put_event = guix_event_queue.first -> event_data;

  521.     /* link this event holder back into free list */
  522.     if (guix_event_queue.free_end)
  523.     {
  524.         guix_event_queue.free_end -> next = guix_event_queue.first;
  525.     }
  526.     else
  527.     {
  528.         guix_event_queue.free = guix_event_queue.first;
  529.     }

  530.     guix_event_queue.free_end = guix_event_queue.first;
  531.     guix_event_queue.first = guix_event_queue.first -> next;
  532.     guix_event_queue.free_end -> next = GX_NULL;

  533.     if (!guix_event_queue.first)
  534.     {
  535.         guix_event_queue.last = GX_NULL;
  536.     }

  537.     /* check for popping out a timer event */
  538.     if (put_event -> gx_event_type == GX_EVENT_TIMER)
  539.     {
  540.         guix_timer_event_pending = GX_FALSE;
  541.     }

  542.     /* unlock the queue */
  543.     OSSemPost(guix_event_queue.lock_sem);
  544.     return GX_SUCCESS;
  545. }

  546. /* event_purge: delete events targetted to particular widget */
  547. VOID   gx_generic_event_purge(GX_WIDGET *target)
  548. {
  549. GX_BOOL Purge;
  550. GUIX_LINKED_EVENT *pTest;

  551.     /* Lock down the guix queue */

  552.     OSSemPend(guix_event_queue.lock_sem, 0, &guix_uc_err);

  553.     // look for events targetted to widget or widget children:
  554.     pTest = guix_event_queue.first;

  555.     while (pTest)
  556.     {
  557.         Purge = GX_FALSE;

  558.         if (pTest ->event_data.gx_event_target)
  559.         {
  560.             if (pTest -> event_data.gx_event_target == target)
  561.             {
  562.                 Purge = GX_TRUE;
  563.             }
  564.             else
  565.             {
  566.                 gx_widget_child_detect(target, pTest->event_data.gx_event_target, &Purge);
  567.             }
  568.             if (Purge)
  569.             {
  570.                 pTest ->event_data.gx_event_target = GX_NULL;
  571.                 pTest->event_data.gx_event_type = 0;
  572.             }
  573.         }
  574.         pTest = pTest -> next;
  575.     }

  576.     OSSemPost(guix_event_queue.lock_sem);
  577. }

  578. /* start the RTOS timer */
  579. VOID   gx_generic_timer_start(VOID)
  580. {
  581.     OSTaskResume(TIMER_TASK_PRIORITY);
  582. }

  583. /* stop the RTOS timer */
  584. VOID   gx_generic_timer_stop(VOID)
  585. {
  586.     OSTaskSuspend(TIMER_TASK_PRIORITY);
  587. }

  588. /* lock the system protection mutex */
  589. VOID   gx_generic_system_mutex_lock(VOID)
  590. {
  591.     OSSemPend(guix_system_lock_semaphore, 0, &guix_uc_err);
  592. }

  593. /* unlock system protection mutex */
  594. VOID   gx_generic_system_mutex_unlock(VOID)
  595. {
  596.     OSSemPost(guix_system_lock_semaphore);
  597. }

  598. /* return number of low-level system timer ticks. Used for pen speed caculations */
  599. ULONG  gx_generic_system_time_get(VOID)
  600. {
  601.     return((ULONG)OSTimeGet());
  602. }

  603. /* thread_identify: return current thread identifier, cast as VOID * */
  604. VOID  *gx_generic_thread_identify(VOID)
  605. {
  606.     return((VOID *)OSTCBCur);
  607. }

  608. /* a simple task to drive the GUIX timer mechanism */
  609. VOID guix_timer_task_entry(VOID *unused)
  610. {
  611. int TickCount = OS_TICKS_PER_SEC / GX_TICKS_SECOND;

  612.     if (TickCount <= 0)
  613.     {
  614.         TickCount = 1;
  615.     }

  616.     while (1)
  617.     {
  618.         OSTimeDly(TickCount);

  619.         /* prevent sending timer events faster than they can be processed */
  620.         if (!guix_timer_event_pending)
  621.         {
  622.             guix_timer_event_pending = GX_TRUE;
  623.             _gx_system_timer_expiration(0);
  624.         }
  625.     }
  626. }

  627. VOID gx_generic_time_delay(int ticks)
  628. {
  629.     OSTimeDly(ticks);
  630. }


  631. #endif /* Binding for UCOS-II enabled */

  632. #endif  /* if !ThreadX */


复制代码


回复

使用道具 举报

5

主题

519

回帖

534

积分

金牌会员

积分
534
发表于 2020-9-15 10:44:33 | 显示全部楼层
有计划有模板吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
 楼主| 发表于 2020-9-15 10:55:14 | 显示全部楼层
hqgboy 发表于 2020-9-15 10:44
有计划有模板吗?

这个可以有,其它RTOS下都整个模板。
回复

使用道具 举报

3

主题

1223

回帖

1232

积分

至尊会员

积分
1232
发表于 2020-9-15 11:56:49 | 显示全部楼层
硬汉大哥,这就是典型的OS接口抽象层,有了这个,可以随便换OS,是吧?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
 楼主| 发表于 2020-9-16 09:44:51 | 显示全部楼层
morning_enr6U 发表于 2020-9-15 11:56
硬汉大哥,这就是典型的OS接口抽象层,有了这个,可以随便换OS,是吧?

对,是这个接口文件。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2024-1-11 13:51:29 | 显示全部楼层
eric2013 发表于 2020-9-16 09:44
对,是这个接口文件。

如果更换了 freertos,例程中 gx_system_initialize,gx_widget_show,gx_system_start 这些函数怎么办?
哪里有初始化模板
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 03:13 , Processed in 0.311541 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表