-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathminiOS_v2.h
320 lines (266 loc) · 9.68 KB
/
miniOS_v2.h
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
#ifndef MINIOS_V2_H
#define MINIOS_V2_H
/***********HNU HaiKou Mei Lan*************
####### ###### ##### ##### ##
## ## ## ## ## ## ## ###
## ## ## ## ### ## ### ##
## ###### ## # ## ## # ## ##
## ## ### ## ### ## ##
## ## ## ## ## ## ##
####### ## ##### ##### ####
------------------------------------------
——miniOS小型多任务程序框架设计——
功能:*适配Cortex M3,stm32f103rct6
致谢:感谢rt_thread的项目
*******copyright v2.0 2022.07.31 ********/
/****************************************
功能:* 适配Cortex M0,LPC1114,Board V3.2
致谢:感谢ucOS II项目, icegoly的blog
*******copyright v2.1 2022.08.04 ********/
/****************************************
功能:* 适配Cortex M4,stm32f401ceu6
* .s文件和M3可以共用,请不要开启FPU
* 移植oled,并且使用软件IIC驱动
致谢:感谢ucOS II项目, icegoly的blog
*******copyright v2.1 2022.08.09 ********/
/****************************************
功能:*增加信号量,现在是结构体数组的方式
*有信号量初始化和take\give两个函数
*可以进行单信号量在两个线程间的乒乓实验
*******copyright v2.2 2022.08.11 ********/
#define lpc1114 0
#define stm32f1 0
#define stm32f4 0
#define gd32f103 1
#include "stdint.h"
#include "stdlib.h"
#if stm32f4
/*todo :请将下面几行代码换成芯片对应的头文件*/
#include "stm32f4xx.h"
#include "core_cm4.h"
#endif
#if gd32f103
#include "gd32f10x.h"
#include "core_cm3.h"
#endif
#define __WEAKDEF __weak
typedef enum
{
os_Task_sys = 0,
os_Task_key,
os_Task_led,
os_Task_gui,
os_Task_wifi,
os_Task_uart,
os_Task_test,
os_Task_idle, //空闲线程永远在os_Task_sum计数之前,所有线程之后
os_Task_sum
} miniOS_ID_t; //线程ID定义,ID越小优先级越高
typedef enum
{
os_suspend = 0, //挂起
os_sleep, //睡眠或者说就绪
os_run, //运行
os_wait_sem //挂起等待信号量
} miniOS_TaskStatus_t;
typedef enum
{
staticSTK = 0,
dynamicSTK
} miniOS_STK_Type;
typedef enum
{
semIdle = 0,
semTaked
} miniOS_semStatus_Type;
//信号量定义
typedef enum
{
os_sem_1 = 1,
os_sem_2 = 2,
os_sem_3 = 3,
os_sem_4 = 4,
os_sem_5 = 5,
os_sem_6 = 6,
os_sem_7 = 7,
os_sem_8 = 8,
os_sem_sum
} miniOS_semId;
/****************************************************************************************************/
/**************************************第二版本******************************************************/
/****************************************************************************************************/
#define idleStackSize 64 /*定义空闲线程栈*/
#define miniOS_CPU_ExceptStkSize 512 /*定义cpu主执行栈*/
typedef unsigned int miniOS_STK; /*定义int类型为栈类型,32位原生数据类型*/
typedef void (*miniOS_TASK)(void *arg); /*任务线程类型*/
extern void miniOS_Hw_contextSw(void); /*汇编代码中的任务切换函数*/
extern void miniOS_Start_Asm(void); /*汇编代码中的用于启动第一个线程*/
extern int32_t miniOS_hw_interrupt_disable(void); /*汇编代码中用于【关闭】全局中断的函数*/
extern void miniOS_hw_interrupt_enable(int32_t level); /*汇编代码中用于【开启】全局中断的函数*/
/*实时任务结构体*/
/*
* !!! 重要信息 Attion
* 正是因为结构体第一个变量是栈指针
* 因此巧妙的现象出现了【线程栈指针 === 线程结构体指针】
* 方便了汇编代码和内核代码的书写
* miniOS_STK *stackptr; # 线程栈地址,stk数组尾部减一的地址,&xStack[XStackSize -1]
* void (*task)(void *arg); # 线程入口函数
* void *taskentry; # 线程入口函数
* void *sp; # 栈基地址 xStack
* int thisID; # 线程ID号
* uint16_t stackSize; # 线程栈大小
* miniOS_TaskStatus_t runflag; # 线程状态,os_suspend,os_sleep,os_run
* miniOS_TaskStatus_t runState; # 线程状态寄存器
* uint16_t runPerid ; # 线程时间片
* uint16_t runTimer ; # 线程时间片计数器
* uint32_t nextTime ; # 线程挂起时间
*/
// typedef struct miniOS_RtTask_s{
// miniOS_STK *stackptr;
//
// void (*task)(void *arg);
// void *taskentry;
// void *sp;
// int thisID;
// uint16_t stackSize;
//
// miniOS_TaskStatus_t runflag;
// miniOS_TaskStatus_t runState;
// uint16_t runPerid ;
// uint16_t runTimer ;
// uint32_t nextTime ;
//
// }miniOS_RtTask_t,*miniOS_RtTask_p;
struct miniOS_RtTask_s;
typedef struct miniOS_RtTask_s miniOS_RtTask_t, *miniOS_RtTask_p;
struct miniOS_sem_s;
typedef struct miniOS_sem_s miniOS_sem_t, *miniOS_sem_p;
/*********************************************miniOS RT队列接口*****************************************************/
// struct queue16;
// struct queue32;
// struct queue64;
// struct queue128;
// struct queue256;
typedef struct queue16
{
unsigned char buf[16];
unsigned char *head;
unsigned char *tail;
} queue16_t;
typedef struct queue32
{
unsigned char buf[32];
unsigned char *head;
unsigned char *tail;
} queue32_t;
typedef struct queue64
{
unsigned char buf[64];
unsigned char *head;
unsigned char *tail;
} queue64_t;
typedef struct queue128
{
unsigned char buf[128];
unsigned char *head;
unsigned char *tail;
} queue128_t;
typedef struct queue255
{
unsigned char buf[255];
unsigned char *head;
unsigned char *tail;
} queue256_t;
// typedef struct queue16 queue16_t;
// typedef struct queue32 queue32_t;
// typedef struct queue64 queue64_t;
// typedef struct queue128 queue128_t;
// typedef struct queue256 queue256_t;
extern void queue_in(unsigned char **head, unsigned char **tail, unsigned char *pbuff, unsigned char pbufflen, unsigned char *data, unsigned char datalen);
extern int queue_out(unsigned char **head, unsigned char **tail, unsigned char *pbuff, unsigned char pbufflen, unsigned char *data, unsigned char datalen);
extern void queue_init(unsigned char **head, unsigned char **tail, unsigned char *pbuff);
extern uint16_t queue_len(unsigned char **head, unsigned char **tail, unsigned char *pbuff, uint16_t pbufflen);
extern int queue_strstr(unsigned char **head, unsigned char **tail, unsigned char *pbuff, uint16_t pbufflen, const char *substr);
/*
* x 结构体
* y 存放数据的变量地址(&a)
*/
#define queueInit(x) queue_init((unsigned char **)&x.head, (unsigned char **)&x.tail, (unsigned char *)x.buf)
#define queueSet(x, y) queue_in((unsigned char **)&x.head, (unsigned char **)&x.tail, (unsigned char *)x.buf, sizeof(x.buf), y, 1)
#define queueSets(x, y, z) queue_in((unsigned char **)&x.head, (unsigned char **)&x.tail, (unsigned char *)x.buf, sizeof(x.buf), y, z)
#define queueOut(x, y) queue_out((unsigned char **)&x.head, (unsigned char **)&x.tail, (unsigned char *)x.buf, sizeof(x.buf), y, 1)
#define queueLen(x) queue_len((unsigned char **)&x.head, (unsigned char **)&x.tail, (unsigned char *)x.buf, (sizeof(x.buf)))
#define queueStrstr(x, y) queue_strstr((unsigned char **)&x.head, (unsigned char **)&x.tail, (unsigned char *)x.buf, (sizeof(x.buf)), y);
/*********************************************miniOS RT汇编s文件使用变量*****************************************************/
extern miniOS_RtTask_p miniOS_curTask;
extern miniOS_RtTask_p miniOS_nextTask;
extern miniOS_STK *miniOS_CPU_ExceptStkBase;
/*********************************************miniOS RT任务接口*****************************************************/
/*miniOS RT 任务结束函数*/
extern void Task_End(void);
/*miniOS RT 线程创建(注册)函数*/
/*
* miniOS_ID_t wantRegTaskId, # 线程表中的ID号
* miniOS_TASK task, # 线程入口地址 void (*taskEntry)(void *arg)
* taskEntry sample:
void taskEntry(void *arg)
{
NEW Variables;
SOME init;
WHILE(1){
TO DO YOUR THINGS;
}
}
* miniOS_STK_Type stkTtpe, # 线程栈类型
* miniOS_STK *stackBaseptr # 线程栈基地址
* miniOS_STK *stackptr , # 线程栈底地址,采用递减栈空间使用
* miniOS_TaskStatus_t runflag,# 线程调度第一次标志
* uint16_t runPerid, # 线程拥有时间片
* uint16_t runTime # 线程延迟启动时间,配合os_suspend标志
*/
extern void miniOS_task_create(miniOS_ID_t wantRegTaskId,
miniOS_TASK task,
void *arg,
miniOS_STK_Type stkTtpe,
miniOS_STK *stackBaseptr,
miniOS_STK *stackptr,
// uint16_t stacksize,
miniOS_TaskStatus_t runflag,
uint16_t runPerid,
uint16_t runTime);
/*miniOS RT系统初始化*/
extern void miniOS_Rt_Init(void);
/*miniOS RT设置下一次线程调度指针*/
extern void setNext(miniOS_ID_t id);
/*miniOS RT 线程删除函数*/
extern void miniOS_RtTask_Delete(miniOS_ID_t taskID);
/*miniOS RT 线程切换函数*/
extern void miniOS_RtTask_SW(void);
/*miniOS RT 系统调度启动函数*/
extern void miniOS_Rt_Start(void);
/*miniOS RT 系统延时函数*/
extern void miniOS_Rt_Delay(uint16_t delayCount);
/*阻塞延时函数ms*/
extern void miniOS_delay_ms(uint16_t nTick);
/*阻塞延时函数us*/
extern void miniOS_delay_us(uint16_t nus);
/*可选延时函数us*/
extern void miniOS_opt_delay(uint16_t delaytime, int rt);
/*miniOS RT 滴答定时器服务函数*/
/*todo : 将此函数放入void SysTick_Handler(void)
*sample:
void SysTick_Handler(void)
{
miniOS_RtTask_sysTickHandle();
}
*/
extern void miniOS_RtTask_sysTickHandle(void);
/*请用户自己实现滴答定时器初始化*/
extern void sysTick_Init(void);
/*请用户自己实现硬件初始化*/
extern void miniOS_HW_Init(void);
extern void miniOS_SwHook(void);
extern void miniOS_sem_init(void);
extern void miniOS_sem_take(uint8_t semID);
extern void miniOS_sem_give(uint8_t semID);
#endif