打印

新版RL-TCPnet V7.X网络协议栈中比较重要的RTOS接口文件net_rots2.h

[复制链接]
408|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
菊江先生|  楼主 | 2018-8-10 21:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
内容备份下,方便直接查看:
通过这个接口文件,其它RTOS也可以使用。
/*------------------------------------------------------------------------------
* MDK Middleware - Component ::Network
* Copyright (c) 2004-2018 ARM Germany GmbH. All rights reserved.
*------------------------------------------------------------------------------
* Name:    net_rtos2.h
* Purpose: Network CMSIS-RTOS2 abstraction layer
* Rev.:    V7.7.1
*----------------------------------------------------------------------------*/

#include "cmsis_os2.h"
#include "rl_net_lib.h"

/* Avoid syntax-checker errors in editor */
#ifndef NET_THREAD_STACK_SIZE
  #define NET_THREAD_STACK_SIZE 1024
  #define NET_THREAD_PRIORITY   osPriorityNormal
#endif

/* Network core resources */
#ifdef RTE_CMSIS_RTOS2_RTX5
  #include "rtx_os.h"
  static osRtxMutex_t  net_lock_cb    __attribute__((section(".bss.os.mutex.cb")));
  static osRtxMutex_t  mem_lock_cb    __attribute__((section(".bss.os.mutex.cb")));
  static osRtxThread_t net_thread_cb  __attribute__((section(".bss.os.thread.cb")));
  static uint64_t      net_stack[NET_THREAD_STACK_SIZE/8]
                                      __attribute__((section(".bss.os.thread.stack")));
  #define __NET_LOCK   &net_lock_cb,   sizeof(net_lock_cb)
  #define __MEM_LOCK   &mem_lock_cb,   sizeof(mem_lock_cb)
  #define __NET_TCB    &net_thread_cb, sizeof(net_thread_cb)
  #define __NET_STACK  &net_stack,     sizeof(net_stack)
#else
  #define __NET_LOCK   NULL, 0
  #define __MEM_LOCK   NULL, 0
  #define __NET_TCB    NULL, 0
  #define __NET_STACK  NULL, NET_THREAD_STACK_SIZE
#endif

static const osMutexAttr_t net_lock = {
  "netCoreMutex",
  osMutexPrioInherit | osMutexRecursive | osMutexRobust,
  __NET_LOCK
};

static const osMutexAttr_t mem_lock = {
  "netMemoryMutex",
  osMutexPrioInherit | osMutexRobust,
  __MEM_LOCK
};

static const osThreadAttr_t net_thread = {
  "netCoreThread",
  osThreadDetached,
  __NET_TCB,
  __NET_STACK,
  NET_THREAD_PRIORITY,
  0,
  0
};

/* Ethernet interface resources */
#if (ETH0_ENABLE)
#ifdef RTE_CMSIS_RTOS2_RTX5
  static osRtxSemaphore_t eth0_lock_cb   __attribute__((section(".bss.os.semaphore.cb")));
  static osRtxThread_t    eth0_thread_cb __attribute__((section(".bss.os.thread.cb")));
  static uint64_t         eth0_stack[ETH0_THREAD_STACK_SIZE/8]
                                         __attribute__((section(".bss.os.thread.stack")));
  #define __ETH0_LOCK     e0_lock_cb,   sizeof(eth0_lock_cb)
  #define __ETH0_TCB      e0_thread_cb, sizeof(eth0_thread_cb)
  #define __ETH0_STACK    e0_stack,     sizeof(eth0_stack)
#else
  #define __ETH0_LOCK     NULL, 0
  #define __ETH0_TCB      NULL, 0
  #define __ETH0_STACK    NULL, ETH0_THREAD_STACK_SIZE
#endif

static const osSemaphoreAttr_t eth0_lock = {
  "netEth0_Semaphore",
  0,
  __ETH0_LOCK
};

static const osThreadAttr_t eth0_thread = {
  "netEth0_Thread",
  osThreadDetached,
  __ETH0_TCB,
  __ETH0_STACK,
  ETH0_THREAD_PRIORITY,
  0,
  0
};
#endif

/* PPP interface resources */
#if (PPP_ENABLE)
#ifdef RTE_CMSIS_RTOS2_RTX5
  static osRtxSemaphore_t ppp_lock_cb    __attribute__((section(".bss.os.semaphore.cb")));
  static osRtxThread_t    ppp_thread_cb  __attribute__((section(".bss.os.thread.cb")));
  static uint64_t         ppp_stack[PPP_THREAD_STACK_SIZE/8]
                                         __attribute__((section(".bss.os.thread.stack")));
  #define __PPP_LOCK      &ppp_lock_cb,   sizeof(ppp_lock_cb)
  #define __PPP_TCB       &ppp_thread_cb, sizeof(ppp_thread_cb)
  #define __PPP_STACK     &ppp_stack,     sizeof(ppp_stack)
#else
  #define __PPP_LOCK      NULL, 0
  #define __PPP_TCB       NULL, 0
  #define __PPP_STACK     NULL, PPP_THREAD_STACK_SIZE
#endif

static const osSemaphoreAttr_t ppp_lock = {
  "netPPP_Semaphore",
  0,
  __PPP_LOCK
};

static const osThreadAttr_t ppp_thread = {
  "netPPP_Thread",
  osThreadDetached,
  __PPP_TCB,
  __PPP_STACK,
  PPP_THREAD_PRIORITY,
  0,
  0
};
#endif

/* SLIP interface resources */
#if (SLIP_ENABLE)
#ifdef RTE_CMSIS_RTOS2_RTX5
  static osRtxSemaphore_t slip_lock_cb   __attribute__((section(".bss.os.semaphore.cb")));
  static osRtxThread_t    slip_thread_cb __attribute__((section(".bss.os.thread.cb")));
  static uint64_t         slip_stack[SLIP_THREAD_STACK_SIZE/8]
                                         __attribute__((section(".bss.os.thread.stack")));
  #define __SLIP_LOCK     &slip_lock_cb,   sizeof(slip_lock_cb)
  #define __SLIP_TCB      &slip_thread_cb, sizeof(slip_thread_cb)
  #define __SLIP_STACK    &slip_stack,     sizeof(slip_stack)
#else
  #define __SLIP_LOCK     NULL, 0
  #define __SLIP_TCB      NULL, 0
  #define __SLIP_STACK    NULL, SLIP_THREAD_STACK_SIZE
#endif

static const osSemaphoreAttr_t slip_lock = {
  "netSLIP_Semaphore",
  0,
  __SLIP_LOCK
};

static const osThreadAttr_t slip_thread = {
  "netSLIP_Thread",
  osThreadDetached,
  __SLIP_TCB,
  __SLIP_STACK,
  SLIP_THREAD_PRIORITY,
  0,
  0
};
#endif


/* Create network core thread */
NETOS_ID netos_thread_create (void) {
  return (osThreadNew ((osThreadFunc_t)&netCore_Thread, NULL, &net_thread));
}

/* Delete network thread */
void netos_thread_delete (NETOS_ID thread) {
  osThreadTerminate (thread);
}

/* Get running thread identifier */
NETOS_ID netos_thread_id (void) {
  return (osThreadGetId ());
}

/* Pass control to next ready thread */
void netos_thread_pass (void) {
  osThreadYield ();
}

/* Create periodic tick timer */
NETOS_ID netos_timer_create (void) {
  return (osTimerNew ((osTimerFunc_t)&net_sys_tick, osTimerPeriodic, NULL, NULL));
}

/* Delete periodic tick timer */
void netos_timer_delete (NETOS_ID timer) {
  osTimerDelete (timer);
}

/* Start periodic tick timer */
void netos_timer_start (NETOS_ID timer, uint32_t interval_ms) {
  osTimerStart (timer, interval_ms);
}

/* Create network protection mutex */
NETOS_ID netos_mutex_create (uint8_t sys_id) {
  switch (sys_id) {
    case 0:  return (osMutexNew (&net_lock));
    default: return (osMutexNew (&mem_lock));
  }
}

/* Delete network protection mutex */
void netos_mutex_delete (NETOS_ID mutex) {
  osMutexDelete (mutex);
}

/* Lock network protection mutex */
void netos_lock (NETOS_ID mutex) {
  osMutexAcquire (mutex, osWaitForever);
}

/* Unlock network protection mutex */
void netos_unlock (NETOS_ID mutex) {
  osMutexRelease (mutex);
}

/* Wait for thread signal/event flag */
void netos_flag_wait (uint32_t flag, uint32_t ms) {
  osThreadFlagsWait (flag, osFlagsWaitAny, ms);
}

/* Set thread signal/event flag */
void netos_flag_set (NETOS_ID thread, uint32_t flag) {
  osThreadFlagsSet (thread, flag);
}

/* Clear thread signal/event flag */
void netos_flag_clear (NETOS_ID thread, uint32_t flag) {
  (void)thread;
  osThreadFlagsClear (flag);
}

/* Delay thread execution */
void netos_delay (uint32_t ms) {
  osDelay (ms);
}

/* Create network interface thread and semaphore */
NETOS_ID netif_create (uint8_t netif, NETOS_ID *semaphore) {
  switch (netif) {
#if (ETH0_ENABLE)
    case  NETIF_ETH:
      *semaphore = osSemaphoreNew (1, 1, e0_lock);
      return (osThreadNew ((osThreadFunc_t)&netETH_Thread, NULL, e0_thread));
#endif
#if (PPP_ENABLE)
    case NETIF_PPP:
      *semaphore = osSemaphoreNew (1, 1, &ppp_lock);
      return (osThreadNew ((osThreadFunc_t)&netPPP_Thread, NULL, &ppp_thread));
#endif
#if (SLIP_ENABLE)
    case NETIF_SLIP:
      *semaphore = osSemaphoreNew (1, 1, &slip_lock);
      return (osThreadNew ((osThreadFunc_t)&netSLIP_Thread, NULL, &slip_thread));
#endif
  }
  return (NULL);
}

/* Delete network interface thread and semaphore */
void netif_delete (NETOS_ID thread, NETOS_ID semaphore) {
  osSemaphoreDelete (semaphore);
  osThreadTerminate (thread);
}

/* Lock interface protection semaphore */
void netif_lock (NETOS_ID semaphore) {
  osSemaphoreAcquire (semaphore, osWaitForever);
}

/* Unlock interface protection semaphore */
void netif_unlock (NETOS_ID semaphore) {
  osSemaphoreRelease (semaphore);
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

447

帖子

0

粉丝