123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 |
- /**
- * @file os_port_windows.c
- * @brief RTOS abstraction layer (Windows)
- *
- * @section License
- *
- * SPDX-License-Identifier: GPL-2.0-or-later
- *
- * Copyright (C) 2010-2023 Oryx Embedded SARL. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * @author Oryx Embedded SARL (www.oryx-embedded.com)
- * @version 2.2.4
- **/
- //Switch to the appropriate trace level
- #define TRACE_LEVEL TRACE_LEVEL_OFF
- //Memory leaks detection
- #if (defined(_WIN32) && defined(_DEBUG))
- #define _CRTDBG_MAP_ALLOC
- #include <stdlib.h>
- #include <crtdbg.h>
- #endif
- //Dependencies
- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
- #include "os_port.h"
- #include "os_port_windows.h"
- #include "debug.h"
- /**
- * @brief Kernel initialization
- **/
- void osInitKernel(void)
- {
- //Not implemented
- }
- /**
- * @brief Start kernel
- **/
- void osStartKernel(void)
- {
- //Not implemented
- }
- /**
- * @brief Create a task
- * @param[in] name A name identifying the task
- * @param[in] taskCode Pointer to the task entry function
- * @param[in] param A pointer to a variable to be passed to the task
- * @param[in] stackSize The initial size of the stack, in words
- * @param[in] priority The priority at which the task should run
- * @return Task identifier referencing the newly created task
- **/
- OsTaskId osCreateTask(const char_t *name, OsTaskCode taskCode,
- void *param, size_t stackSize, int_t priority)
- {
- void *handle;
- //Create a new thread
- handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) taskCode,
- param, 0, NULL);
- //Return a pointer to the newly created thread
- return (OsTaskId) handle;
- }
- /**
- * @brief Delete a task
- * @param[in] taskId Task identifier referencing the task to be deleted
- **/
- void osDeleteTask(OsTaskId taskId)
- {
- //Delete the calling thread?
- if(taskId == OS_SELF_TASK_ID)
- {
- //Kill ourselves
- ExitThread(0);
- }
- else
- {
- //Delete the specified thread
- TerminateThread((HANDLE) taskId, 0);
- }
- }
- /**
- * @brief Delay routine
- * @param[in] delay Amount of time for which the calling task should block
- **/
- void osDelayTask(systime_t delay)
- {
- //Delay the task for the specified duration
- Sleep(delay);
- }
- /**
- * @brief Yield control to the next task
- **/
- void osSwitchTask(void)
- {
- //Not implemented
- }
- /**
- * @brief Suspend scheduler activity
- **/
- void osSuspendAllTasks(void)
- {
- //Not implemented
- }
- /**
- * @brief Resume scheduler activity
- **/
- void osResumeAllTasks(void)
- {
- //Not implemented
- }
- /**
- * @brief Create an event object
- * @param[in] event Pointer to the event object
- * @return The function returns TRUE if the event object was successfully
- * created. Otherwise, FALSE is returned
- **/
- bool_t osCreateEvent(OsEvent *event)
- {
- //Create an event object
- event->handle = CreateEvent(NULL, FALSE, FALSE, NULL);
- //Check whether the returned handle is valid
- if(event->handle != NULL)
- {
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
- /**
- * @brief Delete an event object
- * @param[in] event Pointer to the event object
- **/
- void osDeleteEvent(OsEvent *event)
- {
- //Make sure the handle is valid
- if(event->handle != NULL)
- {
- //Properly dispose the event object
- CloseHandle(event->handle);
- }
- }
- /**
- * @brief Set the specified event object to the signaled state
- * @param[in] event Pointer to the event object
- **/
- void osSetEvent(OsEvent *event)
- {
- //Set the specified event to the signaled state
- SetEvent(event->handle);
- }
- /**
- * @brief Set the specified event object to the nonsignaled state
- * @param[in] event Pointer to the event object
- **/
- void osResetEvent(OsEvent *event)
- {
- //Force the specified event to the nonsignaled state
- ResetEvent(event->handle);
- }
- /**
- * @brief Wait until the specified event is in the signaled state
- * @param[in] event Pointer to the event object
- * @param[in] timeout Timeout interval
- * @return The function returns TRUE if the state of the specified object is
- * signaled. FALSE is returned if the timeout interval elapsed
- **/
- bool_t osWaitForEvent(OsEvent *event, systime_t timeout)
- {
- //Wait until the specified event is in the signaled state or the timeout
- //interval elapses
- if(WaitForSingleObject(event->handle, timeout) == WAIT_OBJECT_0)
- {
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
- /**
- * @brief Set an event object to the signaled state from an interrupt service routine
- * @param[in] event Pointer to the event object
- * @return TRUE if setting the event to signaled state caused a task to unblock
- * and the unblocked task has a priority higher than the currently running task
- **/
- bool_t osSetEventFromIsr(OsEvent *event)
- {
- //Not implemented
- return FALSE;
- }
- /**
- * @brief Create a semaphore object
- * @param[in] semaphore Pointer to the semaphore object
- * @param[in] count The maximum count for the semaphore object. This value
- * must be greater than zero
- * @return The function returns TRUE if the semaphore was successfully
- * created. Otherwise, FALSE is returned
- **/
- bool_t osCreateSemaphore(OsSemaphore *semaphore, uint_t count)
- {
- //Create a semaphore object
- semaphore->handle = CreateSemaphore(NULL, count, count, NULL);
- //Check whether the returned handle is valid
- if(semaphore->handle != NULL)
- {
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
- /**
- * @brief Delete a semaphore object
- * @param[in] semaphore Pointer to the semaphore object
- **/
- void osDeleteSemaphore(OsSemaphore *semaphore)
- {
- //Make sure the handle is valid
- if(semaphore->handle != NULL)
- {
- //Properly dispose the semaphore object
- CloseHandle(semaphore->handle);
- }
- }
- /**
- * @brief Wait for the specified semaphore to be available
- * @param[in] semaphore Pointer to the semaphore object
- * @param[in] timeout Timeout interval
- * @return The function returns TRUE if the semaphore is available. FALSE is
- * returned if the timeout interval elapsed
- **/
- bool_t osWaitForSemaphore(OsSemaphore *semaphore, systime_t timeout)
- {
- //Wait until the specified semaphore becomes available
- if(WaitForSingleObject(semaphore->handle, timeout) == WAIT_OBJECT_0)
- {
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
- /**
- * @brief Release the specified semaphore object
- * @param[in] semaphore Pointer to the semaphore object
- **/
- void osReleaseSemaphore(OsSemaphore *semaphore)
- {
- //Release the semaphore
- ReleaseSemaphore(semaphore->handle, 1, NULL);
- }
- /**
- * @brief Create a mutex object
- * @param[in] mutex Pointer to the mutex object
- * @return The function returns TRUE if the mutex was successfully
- * created. Otherwise, FALSE is returned
- **/
- bool_t osCreateMutex(OsMutex *mutex)
- {
- //Create a mutex object
- mutex->handle = CreateMutex(NULL, FALSE, NULL);
- //Check whether the returned handle is valid
- if(mutex->handle != NULL)
- {
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
- /**
- * @brief Delete a mutex object
- * @param[in] mutex Pointer to the mutex object
- **/
- void osDeleteMutex(OsMutex *mutex)
- {
- //Make sure the handle is valid
- if(mutex->handle != NULL)
- {
- //Properly dispose the mutex object
- CloseHandle(mutex->handle);
- }
- }
- /**
- * @brief Acquire ownership of the specified mutex object
- * @param[in] mutex Pointer to the mutex object
- **/
- void osAcquireMutex(OsMutex *mutex)
- {
- //Obtain ownership of the mutex object
- WaitForSingleObject(mutex->handle, INFINITE);
- }
- /**
- * @brief Release ownership of the specified mutex object
- * @param[in] mutex Pointer to the mutex object
- **/
- void osReleaseMutex(OsMutex *mutex)
- {
- //Release ownership of the mutex object
- ReleaseMutex(mutex->handle);
- }
- /**
- * @brief Retrieve system time
- * @return Number of milliseconds elapsed since the system was last started
- **/
- systime_t osGetSystemTime(void)
- {
- //Get current tick count
- return GetTickCount();
- }
- /**
- * @brief Allocate a memory block
- * @param[in] size Bytes to allocate
- * @return A pointer to the allocated memory block or NULL if
- * there is insufficient memory available
- **/
- __weak_func void *osAllocMem(size_t size)
- {
- //Allocate a memory block
- return malloc(size);
- }
- /**
- * @brief Release a previously allocated memory block
- * @param[in] p Previously allocated memory block to be freed
- **/
- __weak_func void osFreeMem(void *p)
- {
- //Free memory block
- free(p);
- }
|