Files
TencentOS-tiny/net/lwip/port/src/sys_arch.c

358 lines
8.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Copyright (c) 2017 Simon Goldschmidt
* 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: Simon Goldschmidt
*
*/
/* lwIP includes. */
#include "lwip/debug.h"
#include "lwip/def.h"
#include "lwip/sys.h"
#include "lwip/mem.h"
#include "lwip/stats.h"
#if !NO_SYS
#if defined(LWIP_PROVIDE_ERRNO)
int errno;
#endif
u32_t sys_jiffies(void)
{
return tos_systick_get();
}
u32_t sys_now(void)
{
return tos_systick_get();
}
void sys_init(void)
{
}
sys_prot_t sys_arch_protect(void)
{
TOS_CPU_CPSR_ALLOC();
TOS_CPU_INT_DISABLE();
return cpu_cpsr;
}
void sys_arch_unprotect(sys_prot_t cpu_cpsr)
{
TOS_CPU_INT_ENABLE();
}
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
{
k_err_t rc;
rc = tos_sem_create(sem, count);
#if SYS_STATS
++lwip_stats.sys.sem.used;
if (lwip_stats.sys.sem.max < lwip_stats.sys.sem.used) {
lwip_stats.sys.sem.max = lwip_stats.sys.sem.used;
}
#endif
if (rc == K_ERR_NONE) {
return ERR_OK;
}
#if SYS_STATS
++lwip_stats.sys.sem.err;
#endif
printf("[sys_arch]:new sem fail!\n");
return ERR_MEM;
}
void sys_sem_free(sys_sem_t *sem)
{
#if SYS_STATS
--lwip_stats.sys.sem.used;
#endif
tos_sem_destroy(sem);
}
int sys_sem_valid(sys_sem_t *sem)
{
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
return sem->knl_obj.type == KNL_OBJ_TYPE_SEMAPHORE;
#else
#error "need TOS_CFG_OBJECT_VERIFY_EN > 0u"
#endif
}
void sys_sem_set_invalid(sys_sem_t *sem)
{
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
sem->knl_obj.type = KNL_OBJ_TYPE_NONE;
#else
#error "need TOS_CFG_OBJECT_VERIFY_EN > 0u"
#endif
}
/*
<20><><EFBFBD><EFBFBD>timeout<75><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>򷵻<EFBFBD>ֵΪ
<20>ȴ<EFBFBD><C8B4>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѵĺ<D1B5><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20>ź<EFBFBD><C5BA><EFBFBD>δ<EFBFBD><CEB4>ָ<EFBFBD><D6B8>ʱ<EFBFBD><CAB1><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD>źţ<C5BA><C5A3><EFBFBD><EFBFBD><EFBFBD>ֵΪ
SYS_ARCH_TIMEOUT<55><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̲߳<DFB3><CCB2>صȴ<D8B5><C8B4>ź<EFBFBD><C5BA><EFBFBD>
<20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㡣 */
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
{
k_tick_t wait_tick = 0;
k_tick_t start_tick = 0;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
if (sem == SYS_SEM_NULL) {
return SYS_ARCH_TIMEOUT;
}
//<2F><><EFBFBD>Ȼ<EFBFBD>ȡ<EFBFBD><C8A1>ʼ<EFBFBD>ȴ<EFBFBD><C8B4>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
start_tick = sys_now();
//timeout != 0<><30><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ms<6D><73><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3>ʱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
if (timeout != 0) {
//<2F><>msת<73><D7AA><EFBFBD><EFBFBD>ʱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
wait_tick = timeout / (1000 / TOS_CFG_CPU_TICK_PER_SECOND);
if (wait_tick == 0) {
wait_tick = 1;
}
} else {
wait_tick = TOS_TIME_FOREVER; //һֱ<D2BB><D6B1><EFBFBD><EFBFBD>
}
//<2F>ȴ<EFBFBD><C8B4>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>ʾ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ʱ
if (tos_sem_pend(sem, wait_tick) == K_ERR_NONE) {
return ((sys_now() - start_tick) * (1000 / TOS_CFG_CPU_TICK_PER_SECOND));
}
return SYS_ARCH_TIMEOUT;
}
void sys_sem_signal(sys_sem_t *sem)
{
if (tos_sem_post(sem) != K_ERR_NONE) {
printf("[sys_arch]:sem signal fail!\n");
}
}
err_t sys_mutex_new(sys_mutex_t *mutex)
{
k_err_t rc;
rc = tos_mutex_create(mutex);
if (rc == K_ERR_NONE) {
return ERR_OK;
}
printf("[sys_arch]:new mutex fail!\n");
return ERR_MEM;
}
void sys_mutex_free(sys_mutex_t *mutex)
{
tos_mutex_destroy(mutex);
}
int sys_mutex_valid(sys_mutex_t *mutex)
{
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
return mutex->knl_obj.type == KNL_OBJ_TYPE_MUTEX;
#else
#error "need TOS_CFG_OBJECT_VERIFY_EN > 0u"
#endif
}
void sys_mutex_set_invalid(sys_mutex_t *mutex)
{
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
mutex->knl_obj.type = KNL_OBJ_TYPE_NONE;
#else
#error "need TOS_CFG_OBJECT_VERIFY_EN > 0u"
#endif
}
void sys_mutex_lock(sys_mutex_t *mutex)
{
tos_mutex_pend(mutex);
}
void sys_mutex_unlock(sys_mutex_t *mutex)
{
tos_mutex_post(mutex);
}
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn function, void *arg, int stacksize, int prio)
{
k_err_t rc;
sys_thread_t task;
k_stack_t *task_stack;
task = tos_mmheap_calloc(1, sizeof(k_task_t));
if (!task) {
printf("[sys_arch]:memalloc k_task_t fail!\n");
return NULL;
}
task_stack = tos_mmheap_alloc(stacksize);
if (!task_stack) {
printf("[sys_arch]:memalloc task stack fail!\n");
return NULL;
}
/* <20><><EFBFBD><EFBFBD>MidPriority_Task<73><6B><EFBFBD><EFBFBD> */
rc = tos_task_create(task, (char*)name, function, arg,
prio, task_stack, stacksize, 20);
if (rc != K_ERR_NONE) {
printf("[sys_arch]:create task fail! code: %d \r\n", rc);
return NULL;
}
return task;
}
err_t sys_mbox_new(sys_mbox_t *mbox, int size)
{
k_err_t rc;
void *msg_q_pool;
#define MBOX_MSG_MAX 32
msg_q_pool = tos_mmheap_alloc(sizeof(void *) * MBOX_MSG_MAX);
if (!msg_q_pool) {
return ERR_MEM;
}
rc = tos_msg_q_create(mbox, msg_q_pool, MBOX_MSG_MAX);
if (rc != K_ERR_NONE) {
printf("Create mbox fail! code : %d \r\n", rc);
return ERR_MEM;
}
return ERR_OK;
}
void sys_mbox_free(sys_mbox_t *mbox)
{
tos_mmheap_free(mbox->ring_q.pool);
tos_msg_q_destroy(mbox);
}
int sys_mbox_valid(sys_mbox_t *mbox)
{
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
return mbox->knl_obj.type == KNL_OBJ_TYPE_MESSAGE_QUEUE;
#else
#error "need TOS_CFG_OBJECT_VERIFY_EN > 0u"
#endif
}
void sys_mbox_set_invalid(sys_mbox_t *mbox)
{
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
mbox->knl_obj.type = KNL_OBJ_TYPE_NONE;
#else
#error "need TOS_CFG_OBJECT_VERIFY_EN > 0u"
#endif
}
void sys_mbox_post(sys_mbox_t *q, void *msg)
{
tos_msg_q_post(q, msg);
}
err_t sys_mbox_trypost(sys_mbox_t *q, void *msg)
{
if (tos_msg_q_post(q, msg) == K_ERR_NONE) {
return ERR_OK;
}
return ERR_MEM;
}
err_t sys_mbox_trypost_fromisr(sys_mbox_t *q, void *msg)
{
return sys_mbox_trypost(q, msg);
}
u32_t sys_arch_mbox_fetch(sys_mbox_t *q, void **msg, u32_t timeout)
{
void *dummyptr;
k_tick_t wait_tick = 0;
k_tick_t start_tick = 0;
if (!msg) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4A2>Ϣ<EFBFBD>ĵط<C4B5><D8B7>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
msg = &dummyptr;
}
// <20><><EFBFBD>Ȼ<EFBFBD>ȡ<EFBFBD><C8A1>ʼ<EFBFBD>ȴ<EFBFBD><C8B4>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
start_tick = sys_now();
// timeout != 0<><30><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ms<6D><73><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3>ʱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
if (timeout != 0) {
//<2F><>msת<73><D7AA><EFBFBD><EFBFBD>ʱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
wait_tick = timeout / (1000 / TOS_CFG_CPU_TICK_PER_SECOND);
if (wait_tick == 0) {
wait_tick = 1;
}
} else { // һֱ<D2BB><D6B1><EFBFBD><EFBFBD>
wait_tick = TOS_TIME_FOREVER;
}
// <20>ȴ<EFBFBD><C8B4>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>ʾ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ʱ
if (tos_msg_q_pend(q,&(*msg), wait_tick) == K_ERR_NONE) {
return ((sys_now() - start_tick) * (1000 / TOS_CFG_CPU_TICK_PER_SECOND));
}
*msg = NULL;
return SYS_ARCH_TIMEOUT;
}
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *q, void **msg)
{
void *dummyptr;
if (!msg) {
msg = &dummyptr;
}
if (tos_msg_q_pend(q, &(*msg), 0) == K_ERR_NONE) {
return ERR_OK;
}
return SYS_MBOX_EMPTY;
}
#endif /* !NO_SYS */