From 6f61053f2ac6cfa01a33b910401a61e63bca0972 Mon Sep 17 00:00:00 2001 From: Scott Larson Date: Fri, 7 Aug 2020 16:56:45 -0700 Subject: add SMP, Modules, and more processor/tools releases --- .../src/txm_module_manager_callback_request.c | 176 +++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 common_modules/module_manager/src/txm_module_manager_callback_request.c (limited to 'common_modules/module_manager/src/txm_module_manager_callback_request.c') diff --git a/common_modules/module_manager/src/txm_module_manager_callback_request.c b/common_modules/module_manager/src/txm_module_manager_callback_request.c new file mode 100644 index 00000000..ae7e8f15 --- /dev/null +++ b/common_modules/module_manager/src/txm_module_manager_callback_request.c @@ -0,0 +1,176 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Module Manager */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + +#include "tx_api.h" +#include "tx_queue.h" +#include "tx_thread.h" +#include "txm_module.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _txm_module_manager_callback_request PORTABLE C */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* Scott Larson, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function sends a notification callback function request to */ +/* the associated module. */ +/* */ +/* INPUT */ +/* */ +/* module_callback_queue Module callback request queue */ +/* callback_request Callback request */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* tx_queue_send Send module callback request */ +/* */ +/* CALLED BY */ +/* */ +/* ThreadX */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 Scott Larson Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _txm_module_manager_callback_request(TX_QUEUE *module_callback_queue, TXM_MODULE_CALLBACK_MESSAGE *callback_message) +{ + +TX_INTERRUPT_SAVE_AREA + +TXM_MODULE_CALLBACK_MESSAGE *queued_message; +UINT enqueued; +UINT found; +UINT status; + + + /* Lockout interrupts. */ + TX_DISABLE + + /* Determine if the queue is valid. */ + if ((module_callback_queue) && (module_callback_queue -> tx_queue_id == TX_QUEUE_ID)) + { + + /* Yes, the queue is valid. */ + + /* Pickup the current callback request in the queue. */ + queued_message = (TXM_MODULE_CALLBACK_MESSAGE *) module_callback_queue -> tx_queue_read; + + /* Pickup the number of items enqueued. */ + enqueued = module_callback_queue -> tx_queue_enqueued; + + /* Set the found flag to false. */ + found = TX_FALSE; + + /* Loop to look for duplicates in the queue. */ + while (enqueued != 0) + { + + /* Does this entry match the new callback message? */ + if ((queued_message -> txm_module_callback_message_application_function == callback_message -> txm_module_callback_message_application_function) && + (queued_message -> txm_module_callback_message_param_1 == callback_message -> txm_module_callback_message_param_1) && + (queued_message -> txm_module_callback_message_param_2 == callback_message -> txm_module_callback_message_param_2) && + (queued_message -> txm_module_callback_message_param_3 == callback_message -> txm_module_callback_message_param_3) && + (queued_message -> txm_module_callback_message_param_4 == callback_message -> txm_module_callback_message_param_4) && + (queued_message -> txm_module_callback_message_param_5 == callback_message -> txm_module_callback_message_param_5) && + (queued_message -> txm_module_callback_message_param_6 == callback_message -> txm_module_callback_message_param_6) && + (queued_message -> txm_module_callback_message_param_7 == callback_message -> txm_module_callback_message_param_7) && + (queued_message -> txm_module_callback_message_param_8 == callback_message -> txm_module_callback_message_param_8) && + (queued_message -> txm_module_callback_message_reserved1 == callback_message -> txm_module_callback_message_reserved1) && + (queued_message -> txm_module_callback_message_reserved2 == callback_message -> txm_module_callback_message_reserved2)) + { + + /* Update the activation count in the queued request. */ + queued_message -> txm_module_callback_message_activation_count++; + + /* Set the found flag to true. */ + found = TX_TRUE; + + /* Get out of the loop. */ + break; + } + + /* Decrease the number of messages to examine. */ + enqueued--; + + /* Move the callback message to the next message. */ + queued_message++; + + /* Check for wrap? */ + if (((ULONG *) queued_message) >= module_callback_queue -> tx_queue_end) + { + + /* Yes, set the queued message to the beginning of the queue. */ + queued_message = (TXM_MODULE_CALLBACK_MESSAGE *) module_callback_queue -> tx_queue_start; + } + } + + /* Restore interrupts. */ + TX_RESTORE + + /* Determine if we need to send the new callback request. */ + if (found == TX_FALSE) + { + + /* Yes, send the message. */ + status = _tx_queue_send(module_callback_queue, (VOID *) callback_message, TX_NO_WAIT); + + /* Determine if an error was detected. */ + if (status != TX_SUCCESS) + { + + /* Error, increment the error counter and return. */ + _txm_module_manager_callback_error_count++; + } + } + + /* Increment the total number of callbacks. */ + _txm_module_manager_callback_total_count++; + } + else + { + + /* Module instance is not valid. */ + + /* Error, increment the error counter and return. */ + _txm_module_manager_callback_error_count++; + + /* Restore interrupts. */ + TX_RESTORE + } +} + -- cgit v1.3.1