• CMSIS Example


      1 /*----------------------------------------------------------------------------
      2  *      RL-ARM - RTX
      3  *----------------------------------------------------------------------------
      4  *      Name:    MAIL.C
      5  *      Purpose: RTX example program
      6  *----------------------------------------------------------------------------
      7  *
      8  * Copyright (c) 1999-2009 KEIL, 2009-2012 ARM Germany GmbH
      9  * All rights reserved.
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions are met:
     12  *  - Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  *  - Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  *  - Neither the name of ARM  nor the names of its contributors may be used 
     18  *    to endorse or promote products derived from this software without 
     19  *    specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
     22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
     25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
     27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
     28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
     29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
     30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     31  * POSSIBILITY OF SUCH DAMAGE.
     32  *---------------------------------------------------------------------------*/
     33 
     34 #include <stdio.h>
     35 #include "cmsis_os.h"
     36 
     37 /* Thread IDs */
     38 osThreadId tid_thread1;               /* assigned ID for thread 1            */
     39 osThreadId tid_thread2;               /* assigned ID for thread 2            */
     40 
     41 typedef struct {                      /* Mail object structure               */
     42   float    voltage;                   /* AD result of measured voltage       */
     43   float    current;                   /* AD result of measured current       */
     44   uint32_t counter;                   /* A counter value                     */
     45 } T_MEAS;
     46 
     47 osMailQDef(mail, 16, T_MEAS);         /* Define mail queue                   */
     48 osMailQId  mail;
     49 
     50 /* Forward reference */
     51 void send_thread (void const *argument);
     52 void recv_thread (void const *argument);
     53 
     54 /* Thread definitions */
     55 osThreadDef(send_thread, osPriorityNormal, 1, 0);
     56 osThreadDef(recv_thread, osPriorityNormal, 1, 2000);
     57 
     58 
     59 /*----------------------------------------------------------------------------
     60  *  Thread 1: Send thread
     61  *---------------------------------------------------------------------------*/
     62 void send_thread (void const *argument) {
     63   T_MEAS *mptr;
     64 
     65   mptr = osMailAlloc(mail, osWaitForever);           /* Allocate memory      */
     66   mptr->voltage = 223.72;             /* Set the mail content                */
     67   mptr->current = 17.54;
     68   mptr->counter = 120786;
     69   osMailPut(mail, mptr);              /* Send Mail                           */
     70   osDelay(100);
     71 
     72   mptr = osMailAlloc(mail, osWaitForever);           /* Allocate memory      */
     73   mptr->voltage = 227.23;             /* Prepare 2nd mail                    */
     74   mptr->current = 12.41;
     75   mptr->counter = 170823;
     76   osMailPut(mail, mptr);              /* Send Mail                           */
     77   osThreadYield();                    /* Cooperative multitasking            */
     78   osDelay(100);
     79 
     80   mptr = osMailAlloc(mail, osWaitForever);           /* Allocate memory      */
     81   mptr->voltage = 229.44;             /* Prepare 3rd mail                    */
     82   mptr->current = 11.89;
     83   mptr->counter = 237178;
     84   osMailPut(mail, mptr);              /* Send Mail                           */
     85   osDelay(100);
     86                                       /* We are done here, exit this thread  */
     87 }
     88 
     89 /*----------------------------------------------------------------------------
     90  *  Thread 2: Receive thread
     91  *---------------------------------------------------------------------------*/
     92 void recv_thread (void const *argument) {
     93   T_MEAS  *rptr;
     94   osEvent  evt;
     95 
     96   for (;;) {
     97     evt = osMailGet(mail, osWaitForever);  /* wait for mail                  */
     98     if (evt.status == osEventMail) {
     99       rptr = evt.value.p;
    100       printf ("
    Voltage: %.2f V
    ",rptr->voltage);
    101       printf ("Current: %.2f A
    ",rptr->current);
    102       printf ("Number of cycles: %d
    ",(int)rptr->counter);
    103       #ifdef __USE_FFLUSH
    104       fflush (stdout);
    105       #endif
    106       osMailFree(mail, rptr);         /* free memory allocated for mail      */
    107     }
    108   }
    109 }
    110 
    111 /*----------------------------------------------------------------------------
    112  *   Main:
    113  *---------------------------------------------------------------------------*/
    114 int main (void) {                     /* program execution starts here       */
    115 
    116   mail = osMailCreate(osMailQ(mail), NULL);  /* create mail queue            */
    117 
    118   tid_thread1 = osThreadCreate(osThread(send_thread), NULL);
    119   tid_thread2 = osThreadCreate(osThread(recv_thread), NULL);
    120 
    121   osDelay(osWaitForever);
    122   for (;;);
    123 }
    124 
    125 /*----------------------------------------------------------------------------
    126  * end of file
    127  *---------------------------------------------------------------------------*/
      1 /*----------------------------------------------------------------------------
      2  *      RL-ARM - RTX
      3  *----------------------------------------------------------------------------
      4  *      Name:    MESSAGE.C
      5  *      Purpose: RTX example program
      6  *----------------------------------------------------------------------------
      7  *
      8  * Copyright (c) 1999-2009 KEIL, 2009-2012 ARM Germany GmbH
      9  * All rights reserved.
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions are met:
     12  *  - Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  *  - Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  *  - Neither the name of ARM  nor the names of its contributors may be used 
     18  *    to endorse or promote products derived from this software without 
     19  *    specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
     22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
     25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
     27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
     28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
     29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
     30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     31  * POSSIBILITY OF SUCH DAMAGE.
     32  *---------------------------------------------------------------------------*/
     33 
     34 #include <stdio.h>
     35 #include "cmsis_os.h"
     36 
     37 /* Thread IDs */
     38 osThreadId tid_thread1;               /* assigned ID for thread 1            */
     39 osThreadId tid_thread2;               /* assigned ID for thread 2            */
     40 
     41 typedef struct {                      /* Message object structure            */
     42   float    voltage;                   /* AD result of measured voltage       */
     43   float    current;                   /* AD result of measured current       */
     44   uint32_t counter;                   /* A counter value                     */
     45 } T_MEAS;
     46 
     47 osPoolDef(mpool, 16, T_MEAS);             /* Define memory pool              */
     48 osPoolId  mpool;
     49 osMessageQDef(MsgBox, 16, T_MEAS);        /* Define message queue            */
     50 osMessageQId  MsgBox;
     51 
     52 /* Forward reference */
     53 void send_thread (void const *argument);
     54 void recv_thread (void const *argument);
     55 
     56 /* Thread definitions */
     57 osThreadDef(send_thread, osPriorityNormal, 1, 0);
     58 osThreadDef(recv_thread, osPriorityNormal, 1, 2000);
     59 
     60 
     61 /*----------------------------------------------------------------------------
     62  *  Thread 1: Send thread
     63  *---------------------------------------------------------------------------*/
     64 void send_thread (void const *argument) {
     65   T_MEAS    *mptr;
     66 
     67   mptr = osPoolAlloc(mpool);          /* Allocate memory for the message     */
     68   mptr->voltage = 223.72;             /* Set the message content             */
     69   mptr->current = 17.54;
     70   mptr->counter = 120786;
     71   osMessagePut(MsgBox, (uint32_t)mptr, osWaitForever);  /* Send Message      */
     72   osDelay(100);
     73 
     74   mptr = osPoolAlloc(mpool);          /* Allocate memory for the message     */
     75   mptr->voltage = 227.23;             /* Prepare a 2nd message               */
     76   mptr->current = 12.41;
     77   mptr->counter = 170823;
     78   osMessagePut(MsgBox, (uint32_t)mptr, osWaitForever);  /* Send Message      */
     79   osThreadYield();                    /* Cooperative multitasking            */
     80   osDelay(100);
     81 
     82   mptr = osPoolAlloc(mpool);          /* Allocate memory for the message     */
     83   mptr->voltage = 229.44;             /* Prepare a 3rd message               */
     84   mptr->current = 11.89;
     85   mptr->counter = 237178;
     86   osMessagePut(MsgBox, (uint32_t)mptr, osWaitForever);  /* Send Message      */
     87   osDelay(100);
     88                                       /* We are done here, exit this thread  */
     89 }
     90 
     91 /*----------------------------------------------------------------------------
     92  *  Thread 2: Receive thread
     93  *---------------------------------------------------------------------------*/
     94 void recv_thread (void const *argument) {
     95   T_MEAS  *rptr;
     96   osEvent  evt;
     97 
     98   for (;;) {
     99     evt = osMessageGet(MsgBox, osWaitForever);  /* wait for message          */
    100     if (evt.status == osEventMessage) {
    101       rptr = evt.value.p;
    102       printf ("
    Voltage: %.2f V
    ",rptr->voltage);
    103       printf ("Current: %.2f A
    ",rptr->current);
    104       printf ("Number of cycles: %d
    ",(int)rptr->counter);
    105       #ifdef __USE_FFLUSH
    106       fflush (stdout);
    107       #endif
    108       osPoolFree(mpool,rptr);         /* free memory allocated for message   */
    109     }
    110   }
    111 }
    112 
    113 /*----------------------------------------------------------------------------
    114  *   Main:
    115  *---------------------------------------------------------------------------*/
    116 int main (void) {                     /* program execution starts here       */
    117 
    118   mpool = osPoolCreate(osPool(mpool));  /* create memory pool                */
    119   MsgBox = osMessageCreate(osMessageQ(MsgBox), NULL);  /* create msg queue   */
    120 
    121   tid_thread1 = osThreadCreate(osThread(send_thread), NULL);
    122   tid_thread2 = osThreadCreate(osThread(recv_thread), NULL);
    123 
    124   osDelay(osWaitForever);
    125   for (;;);
    126 }
    127 
    128 /*----------------------------------------------------------------------------
    129  * end of file
    130  *---------------------------------------------------------------------------*/
  • 相关阅读:
    Oracle 19.3 RAC on Redhat 7.6 安装最佳实践
    宝宝换牙期 需要注意这几点
    人生与机会
    历届「Jolt Awards」获奖书籍
    语言包缩写
    用XMLTask操作XML
    clearcase命令(转)
    【ZT】我家宝宝不会哭分享在美国养孩子的妈妈经(必看)
    Ubuntu启动问题以及Grub Rescue修复方法
    几个远程桌面客户端
  • 原文地址:https://www.cnblogs.com/shangdawei/p/3854408.html
Copyright © 2020-2023  润新知