sys_arch.c
9.05 KB
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
321
322
323
324
325
326
/*
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* This file is part of the lwIP TCP/IP stack.
*
* Author: Adam Dunkels <adam@sics.se>
*
*/
/* Porting by Michael Vysotsky <michaelvy@hotmail.com> August 2011 */
//#define SYS_ARCH_GLOBALS
///* lwIP includes. */
////#include "lwip/debug.h"
////#include "lwip/def.h"
////#include "lwip/lwip_sys.h"
////#include "lwip/mem.h"
////#include "includes.h"
////#include "delay.h"
////#include "arch/sys_arch.h"
////#include "malloc.h"
////当消息指针为空时,指向一个常量pvNullPointer所指向的值.
////在UCOS中如果OSQPost()中的msg==NULL会返回一条OS_ERR_POST_NULL
////错误,而在lwip中会调用sys_mbox_post(mbox,NULL)发送一条空消息,我们
////在本函数中把NULL变成一个常量指针0Xffffffff
//const void * const pvNullPointer = (mem_ptr_t*)0xffffffff;
//
////创建一个消息邮箱
////*mbox:消息邮箱
////size:邮箱大小
////返回值:ERR_OK,创建成功
//// 其他,创建失败
//err_t sys_mbox_new( sys_mbox_t *mbox, int size)
//{
// (*mbox)=mymalloc(SRAMIN,sizeof(TQ_DESCR)); //为消息邮箱申请内存
// mymemset((*mbox),0,sizeof(TQ_DESCR)); //清除mbox的内存
// if(*mbox)//内存分配成功
// {
// if(size>MAX_QUEUE_ENTRIES)size=MAX_QUEUE_ENTRIES; //消息队列最多容纳MAX_QUEUE_ENTRIES消息数目
// (*mbox)->pQ=OSQCreate(&((*mbox)->pvQEntries[0]),size); //使用UCOS创建一个消息队列
// LWIP_ASSERT("OSQCreate",(*mbox)->pQ!=NULL);
// if((*mbox)->pQ!=NULL)return ERR_OK; //返回ERR_OK,表示消息队列创建成功 ERR_OK=0
// else
// {
// myfree(SRAMIN,(*mbox));
// return ERR_MEM; //消息队列创建错误
// }
// }else return ERR_MEM; //消息队列创建错误
//}
////释放并删除一个消息邮箱
////*mbox:要删除的消息邮箱
//void sys_mbox_free(sys_mbox_t * mbox)
//{
// u8_t ucErr;
// sys_mbox_t m_box=*mbox;
// (void)OSQDel(m_box->pQ,OS_DEL_ALWAYS,&ucErr);
// LWIP_ASSERT( "OSQDel ",ucErr == OS_ERR_NONE );
// myfree(SRAMIN,m_box);
// *mbox=NULL;
//}
////向消息邮箱中发送一条消息(必须发送成功)
////*mbox:消息邮箱
////*msg:要发送的消息
//void sys_mbox_post(sys_mbox_t *mbox,void *msg)
//{
// if(msg==NULL)msg=(void*)&pvNullPointer;//当msg为空时 msg等于pvNullPointer指向的值
// while(OSQPost((*mbox)->pQ,msg)!=OS_ERR_NONE);//死循环等待消息发送成功
//}
////尝试向一个消息邮箱发送消息
////此函数相对于sys_mbox_post函数只发送一次消息,
////发送失败后不会尝试第二次发送
////*mbox:消息邮箱
////*msg:要发送的消息
////返回值:ERR_OK,发送OK
//// ERR_MEM,发送失败
//err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
//{
// if(msg==NULL)msg=(void*)&pvNullPointer;//当msg为空时 msg等于pvNullPointer指向的值
// if((OSQPost((*mbox)->pQ, msg))!=OS_ERR_NONE)return ERR_MEM;
// return ERR_OK;
//}
////等待邮箱中的消息
////*mbox:消息邮箱
////*msg:消息
////timeout:超时时间,如果timeout为0的话,就一直等待
////返回值:当timeout不为0时如果成功的话就返回等待的时间,
//// 失败的话就返回超时SYS_ARCH_TIMEOUT
//u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
//{
// u8_t ucErr;
// u32_t ucos_timeout,timeout_new;
// void *temp;
// sys_mbox_t m_box=*mbox;
// if(timeout!=0)
// {
// ucos_timeout=(timeout*OS_TICKS_PER_SEC)/1000; //转换为节拍数,因为UCOS延时使用的是节拍数,而LWIP是用ms
// if(ucos_timeout<1)ucos_timeout=1;//至少1个节拍
// }else ucos_timeout = 0;
// timeout = OSTimeGet(); //获取系统时间
// temp=OSQPend(m_box->pQ,(u16_t)ucos_timeout,&ucErr); //请求消息队列,等待时限为ucos_timeout
// if(msg!=NULL)
// {
// if(temp==(void*)&pvNullPointer)*msg = NULL; //因为lwip发送空消息的时候我们使用了pvNullPointer指针,所以判断pvNullPointer指向的值
// else *msg=temp; //就可知道请求到的消息是否有效
// }
// if(ucErr==OS_ERR_TIMEOUT)timeout=SYS_ARCH_TIMEOUT; //请求超时
// else
// {
// LWIP_ASSERT("OSQPend ",ucErr==OS_ERR_NONE);
// timeout_new=OSTimeGet();
// if (timeout_new>timeout) timeout_new = timeout_new - timeout;//算出请求消息或使用的时间
// else timeout_new = 0xffffffff - timeout + timeout_new;
// timeout=timeout_new*1000/OS_TICKS_PER_SEC + 1;
// }
// return timeout;
//}
////尝试获取消息
////*mbox:消息邮箱
////*msg:消息
////返回值:等待消息所用的时间/SYS_ARCH_TIMEOUT
//u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
//{
// return sys_arch_mbox_fetch(mbox,msg,1);//尝试获取一个消息
//}
////检查一个消息邮箱是否有效
////*mbox:消息邮箱
////返回值:1,有效.
//// 0,无效
//int sys_mbox_valid(sys_mbox_t *mbox)
//{
// sys_mbox_t m_box=*mbox;
// u8_t ucErr;
// int ret;
// OS_Q_DATA q_data;
// memset(&q_data,0,sizeof(OS_Q_DATA));
// ucErr=OSQQuery (m_box->pQ,&q_data);
// ret=(ucErr<2&&(q_data.OSNMsgs<q_data.OSQSize))?1:0;
// return ret;
//}
////设置一个消息邮箱为无效
////*mbox:消息邮箱
//void sys_mbox_set_invalid(sys_mbox_t *mbox)
//{
// *mbox=NULL;
//}
////创建一个信号量
////*sem:创建的信号量
////count:信号量值
////返回值:ERR_OK,创建OK
//// ERR_MEM,创建失败
//err_t sys_sem_new(sys_sem_t * sem, u8_t count)
//{
// u8_t err;
// *sem=OSSemCreate((u16_t)count);
// if(*sem==NULL)return ERR_MEM;
// OSEventNameSet(*sem,"LWIP Sem",&err);
// LWIP_ASSERT("OSSemCreate ",*sem != NULL );
// return ERR_OK;
//}
////等待一个信号量
////*sem:要等待的信号量
////timeout:超时时间
////返回值:当timeout不为0时如果成功的话就返回等待的时间,
//// 失败的话就返回超时SYS_ARCH_TIMEOUT
//u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
//{
// u8_t ucErr;
// u32_t ucos_timeout, timeout_new;
// if( timeout!=0)
// {
// ucos_timeout = (timeout * OS_TICKS_PER_SEC) / 1000;//转换为节拍数,因为UCOS延时使用的是节拍数,而LWIP是用ms
// if(ucos_timeout < 1)
// ucos_timeout = 1;
// }else ucos_timeout = 0;
// timeout = OSTimeGet();
// OSSemPend (*sem,(u16_t)ucos_timeout, (u8_t *)&ucErr);
// if(ucErr == OS_ERR_TIMEOUT)timeout=SYS_ARCH_TIMEOUT;//请求超时
// else
// {
// timeout_new = OSTimeGet();
// if (timeout_new>=timeout) timeout_new = timeout_new - timeout;
// else timeout_new = 0xffffffff - timeout + timeout_new;
// timeout = (timeout_new*1000/OS_TICKS_PER_SEC + 1);//算出请求消息或使用的时间(ms)
// }
// return timeout;
//}
////发送一个信号量
////sem:信号量指针
//void sys_sem_signal(sys_sem_t *sem)
//{
// OSSemPost(*sem);
//}
////释放并删除一个信号量
////sem:信号量指针
//void sys_sem_free(sys_sem_t *sem)
//{
// u8_t ucErr;
// (void)OSSemDel(*sem,OS_DEL_ALWAYS,&ucErr );
// if(ucErr!=OS_ERR_NONE)LWIP_ASSERT("OSSemDel ",ucErr==OS_ERR_NONE);
// *sem = NULL;
//}
////查询一个信号量的状态,无效或有效
////sem:信号量指针
////返回值:1,有效.
//// 0,无效
//int sys_sem_valid(sys_sem_t *sem)
//{
// OS_SEM_DATA sem_data;
// return (OSSemQuery (*sem,&sem_data) == OS_ERR_NONE )? 1:0;
//}
////设置一个信号量无效
////sem:信号量指针
//void sys_sem_set_invalid(sys_sem_t *sem)
//{
// *sem=NULL;
//}
////arch初始化
//void sys_init(void)
//{
// //这里,我们在该函数,不做任何事情
//}
//extern OS_STK * TCPIP_THREAD_TASK_STK;//TCP IP内核任务堆栈,在lwip_comm函数定义
////创建一个新进程
////*name:进程名称
////thred:进程任务函数
////*arg:进程任务函数的参数
////stacksize:进程任务的堆栈大小
////prio:进程任务的优先级
//sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
//{
// OS_CPU_SR cpu_sr;
// if(strcmp(name,TCPIP_THREAD_NAME)==0)//创建TCP IP内核任务
// {
// OS_ENTER_CRITICAL(); //进入临界区
// OSTaskCreate(thread,arg,(OS_STK*)&TCPIP_THREAD_TASK_STK[stacksize-1],prio);//创建TCP IP内核任务
// OS_EXIT_CRITICAL(); //退出临界区
// }
// return 0;
//}
////lwip延时函数
////ms:要延时的ms数
//void sys_msleep(u32_t ms)
//{
// delay_ms(ms);
//}
////获取系统时间,LWIP1.4.1增加的函数
////返回值:当前系统时间(单位:毫秒)
//u32_t sys_now(void)
//{
// u32_t ucos_time, lwip_time;
// ucos_time=OSTimeGet(); //获取当前系统时间 得到的是UCSO的节拍数
// lwip_time=(ucos_time*1000/OS_TICKS_PER_SEC+1);//将节拍数转换为LWIP的时间MS
// return lwip_time; //返回lwip_time;
//}