
1 /*----------------------------------------------------------------------------
2 * RL-ARM - RTX
3 *----------------------------------------------------------------------------
4 * Name: RTX_EX2.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 "cmsis_os.h"
35
36 volatile uint16_t counter; /* counter for main thread */
37 volatile uint16_t counter1; /* counter for thread 1 */
38 volatile uint16_t counter2; /* counter for thread 2 */
39 volatile uint16_t counter3; /* counter for thread 3 */
40
41 /* Thread IDs */
42 osThreadId thread1_id;
43 osThreadId thread2_id;
44 osThreadId thread3_id;
45
46 /* Forward reference */
47 void job1 (void const *argument);
48 void job2 (void const *argument);
49 void job3 (void const *argument);
50
51 /* Thread definitions */
52 osThreadDef(job1, osPriorityAboveNormal, 1, 0);
53 osThreadDef(job2, osPriorityNormal, 1, 0);
54 osThreadDef(job3, osPriorityNormal, 1, 0);
55
56 /*----------------------------------------------------------------------------
57 * Thread 1: 'job1'
58 *---------------------------------------------------------------------------*/
59 void job1 (void const *argument) { /* higher priority to preempt job2 */
60 while (1) { /* endless loop */
61 counter1++; /* increment counter 1 */
62 osDelay(10); /* wait for timeout: 10ms */
63 }
64 }
65
66 /*----------------------------------------------------------------------------
67 * Thread 2: 'job2'
68 *---------------------------------------------------------------------------*/
69 void job2 (void const *argument) {
70 while (1) { /* endless loop */
71 counter2++; /* increment counter 2 */
72 if (counter2 == 0) { /* signal overflow of counter 2 */
73 osSignalSet(thread3_id, 0x0001);/* to thread 3 */
74 osThreadYield();
75 }
76 }
77 }
78
79 /*----------------------------------------------------------------------------
80 * Thread 3: 'job3'
81 *---------------------------------------------------------------------------*/
82 void job3 (void const *argument) {
83 while (1) { /* endless loop */
84 osSignalWait(0x0001, osWaitForever); /* wait for signal event */
85 counter3++; /* process overflow from counter 2 */
86 }
87 }
88
89 /*----------------------------------------------------------------------------
90 * Main Thread
91 *---------------------------------------------------------------------------*/
92 int main (void) { /* program execution starts here */
93
94 /* Set higher priority of main thread to preempt job2 */
95 osThreadSetPriority(osThreadGetId(), osPriorityAboveNormal);
96
97 thread1_id = osThreadCreate(osThread(job1),NULL); /* create thread1 */
98 thread2_id = osThreadCreate(osThread(job2),NULL); /* create thread2 */
99 thread3_id = osThreadCreate(osThread(job3),NULL); /* create thread3 */
100
101 while (1) { /* endless loop */
102 counter++; /* increment counter */
103 osDelay(5); /* wait for timeout: 5ms */
104 }
105 }
106
107 /*----------------------------------------------------------------------------
108 * end of file
109 *---------------------------------------------------------------------------*/

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
2013-07-18 Bus Blaster