-
Notifications
You must be signed in to change notification settings - Fork 0
/
RTOSQueue
155 lines (126 loc) · 4.09 KB
/
RTOSQueue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include "project.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
// FreeRTOS header Files
#include "FreeRTOS_PSoC.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "timers.h"
#include "event_groups.h"
typedef struct CMDMSG{
bool LedState;
char str[20+1];
} CMDMSG;
#define QUEUE_ITEM_SIZE (sizeof (CMDMSG))
#define QUEUE_LENGTH 10
QueueHandle_t xCmdQueue;
// Your task functions
void vMyTask1(void *pvParameters);
void vMyTask2(void *pvParameters);
//===================================
void myPSoCSetup()
{
LED1_Write(0);
LCD_Start();
LCD_ClearDisplay();
LCD_Position(0,0);
LCD_PrintString("FreeRTOS-Queue");
CyDelay(2000);
LCD_Position(1,0);
LCD_PrintString("SW1- On/Off LED1");
}
//===================================
int main(void)
{
BaseType_t err;
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
FreeRTOS_Init();
myPSoCSetup();
//Create Queue
xCmdQueue = xQueueCreate(QUEUE_LENGTH, QUEUE_ITEM_SIZE);
if (xCmdQueue == NULL){
while(1); //Cannot Create queue
}
//Create Task 1
err = xTaskCreate( vMyTask1, //TaskFunction_t pvTaskCode,
"Task 1", //const char * const pcName,
configMINIMAL_STACK_SIZE, //unsigned short usStackDepth,
NULL, //void *pvParameters,
configMAX_PRIORITIES-1, //UBaseType_t uxPriority,
NULL); //TaskHandle_t *pxCreatedTask );
if (err != pdPASS){
//cannot create task!
while(1); //Stop here
}
//Create Task 2
err = xTaskCreate( vMyTask2, //TaskFunction_t pvTaskCode,
"Task 2", //const char * const pcName,
configMINIMAL_STACK_SIZE, //unsigned short usStackDepth,
NULL, //void *pvParameters,
configMAX_PRIORITIES-1, //UBaseType_t uxPriority,
NULL); //TaskHandle_t *pxCreatedTask );
if (err != pdPASS){
//cannot create task!
while(1); //Stop here
}
vTaskStartScheduler();
for(;;)
{
/* Place your application code here. */
}
}
//===============================
void vMyTask1(void *pvParameters){
CMDMSG cmd;
bool presw1 = true;
bool currsw1;
cmd.LedState = false;
while(1){
// 1. Read current nSW1 state
currsw1 = nSW1_Read();
// 2. Check the edge
if ((presw1 == true) && (currsw1 == false)){
cmd.LedState = !cmd.LedState;
if (cmd.LedState)
sprintf(cmd.str, "Turn On LED1...");
else
sprintf(cmd.str, "Turn of LED1..");
while(xQueueSend(xCmdQueue, &cmd, 0) != pdPASS){};
}
// 3. Update presw1 to currsw1
presw1 = currsw1;
vTaskDelay(pdMS_TO_TICKS(20));
}
}
//===============================
void vMyTask2(void *pvParameters){
CMDMSG cmd;
int timeout = -1;
while(1){
if (xQueueReceive( xCmdQueue, &cmd, 0) == pdPASS){
if (cmd.LedState)
LED1_Write(1);
else
LED1_Write(0);
LCD_Position(2,0);
LCD_PrintString(" "); //20 Soace-Characters
LCD_Position(2,0);
LCD_PrintString(cmd.str);
timeout = 100;
}
if(timeout == 0) {
LCD_Position(2,0);
LCD_PrintString(" "); //20 Soace-Characters
timeout = -1;
}
if (timeout > 0)
timeout--;
vTaskDelay(pdMS_TO_TICKS(10));
}
//===============================
}