硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3101|回复: 13
收起左侧

[embOS] 原创,终于打通 embOS+LwIP 网络接口sys_arch.c/.h 的底层驱动

[复制链接]

608

主题

3043

回帖

4887

积分

至尊会员

积分
4887
发表于 2020-4-28 09:17:43 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2020-4-28 09:40 编辑

原创,终于打通 embOS+LwIP 网络接口sys_arch.c/.h 的底层驱动


sys_arch.h (2.41 KB, 下载次数: 7)

sys_arch.c (13.67 KB, 下载次数: 8)

目前已知 bug 说明一下

1. 在 开发板 客户端(服务器) 端没有与 远程 的 服务器(客户端) 连接时, 貌似过一会就会出现 硬件中断错误,目前初步估计应该是 消息邮箱 溢出造成的,
   后续有待解决,

2. 如有谁有比较好的解决之法,欢迎更正
3. 开发板与远程设备一旦连接上,就不会出现上述的问题了,而且工作也基本稳定
4. embOS V5.02a
    Lwip    v2.1.2










回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-28 09:47:52 | 显示全部楼层
你搞得那个封装层版呢,这个封装层版的好用。
  1. /*
  2. * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without modification,
  6. * are permitted provided that the following conditions are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright notice,
  9. *    this list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright notice,
  11. *    this list of conditions and the following disclaimer in the documentation
  12. *    and/or other materials provided with the distribution.
  13. * 3. The name of the author may not be used to endorse or promote products
  14. *    derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
  17. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  18. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
  19. * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  20. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
  21. * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  22. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  23. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  24. * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
  25. * OF SUCH DAMAGE.
  26. *
  27. * This file is part of the lwIP TCP/IP stack.
  28. *
  29. * Author: Adam Dunkels <adam@sics.se>
  30. *
  31. */

  32. #include <string.h>
  33. #include "cmsis_os2.h"

  34. #include "lwip/opt.h"
  35. #include "lwip/sys.h"

  36. #if !NO_SYS

  37. static uint32_t tick_freq;

  38. /* Time to kernel ticks */
  39. static uint32_t ms2tick (uint32_t ms) {
  40.   if (ms == 0U) {
  41.     return (osWaitForever);
  42.   }
  43.   if (tick_freq != 0U) {
  44.     ms = (ms * tick_freq) / 1000U;
  45.   }
  46.   return (ms);
  47. }

  48. /* Kernel ticks to time */
  49. static uint32_t tick2ms (uint32_t tick) {
  50.   if (tick_freq != 0U) {
  51.     tick = (tick * 1000U) / tick_freq;
  52.   }
  53.   return (tick);
  54. }

  55. /* Mutexes */
  56. err_t sys_mutex_new(sys_mutex_t *mutex)
  57. {
  58.   static const osMutexAttr_t attr = {
  59.     NULL, osMutexPrioInherit | osMutexRecursive | osMutexRobust, NULL, NULL
  60.   };
  61.   osMutexId_t id;

  62.   id = osMutexNew(&attr);
  63.   if (id == NULL) {
  64.     return ERR_MEM;
  65.   }
  66.   *mutex = id;
  67.   return ERR_OK;
  68. }

  69. void sys_mutex_free(sys_mutex_t *mutex)
  70. {
  71.   osMutexDelete(*mutex);
  72. }

  73. void sys_mutex_lock(sys_mutex_t *mutex)
  74. {
  75.   osMutexAcquire(*mutex, osWaitForever);
  76. }

  77. void sys_mutex_unlock(sys_mutex_t *mutex)
  78. {
  79.   osMutexRelease(*mutex);
  80. }

  81. /* Semaphores */
  82. err_t sys_sem_new(sys_sem_t *sem, u8_t count)
  83. {
  84.   osSemaphoreId_t id;

  85.   id = osSemaphoreNew(1U, count, NULL);
  86.   if (id == NULL) {
  87.     return ERR_MEM;
  88.   }
  89.   *sem = id;
  90.   return ERR_OK;
  91. }

  92. void sys_sem_free(sys_sem_t *sem)
  93. {
  94.   osSemaphoreDelete(*sem);
  95. }

  96. u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
  97. {
  98.   osStatus_t status;

  99.   status = osSemaphoreAcquire(*sem, ms2tick(timeout));
  100.   if (status != osOK) {
  101.     return SYS_ARCH_TIMEOUT;
  102.   }
  103.   return 0U;
  104. }

  105. void sys_sem_signal(sys_sem_t *sem)
  106. {
  107.   osSemaphoreRelease(*sem);
  108. }

  109. /* Mailboxes */
  110. err_t sys_mbox_new(sys_mbox_t *mbox, int size)
  111. {
  112.   osMessageQueueId_t id;

  113.   id = osMessageQueueNew((uint32_t)size, sizeof(void *), NULL);
  114.   if (id == NULL) {
  115.     return ERR_MEM;
  116.   }
  117.   *mbox = id;
  118.   return ERR_OK;
  119. }

  120. void sys_mbox_free(sys_mbox_t *mbox)
  121. {
  122.   osMessageQueueDelete(*mbox);
  123. }

  124. void sys_mbox_post(sys_mbox_t *mbox, void *msg)
  125. {
  126.   osMessageQueuePut(*mbox, &msg, 0, osWaitForever);
  127. }

  128. err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
  129. {
  130.   osStatus_t status;

  131.   status = osMessageQueuePut(*mbox, &msg, 0U, 0U);
  132.   if (status != osOK) {
  133.     return ERR_MEM;
  134.   }
  135.   return ERR_OK;
  136. }

  137. u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
  138. {
  139.   osStatus_t status;

  140.   status = osMessageQueueGet (*mbox, msg, NULL, ms2tick(timeout));
  141.   if (status != osOK) {
  142.     return SYS_ARCH_TIMEOUT;
  143.   }
  144.   return 0U;
  145. }

  146. u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
  147. {
  148.   osStatus_t status;

  149.   status = osMessageQueueGet (*mbox, msg, NULL, 0U);
  150.   if (status != osOK) {
  151.     return SYS_MBOX_EMPTY;
  152.   }
  153.   return 0U;
  154. }

  155. /* Threads */
  156. sys_thread_t sys_thread_new(const char *name, lwip_thread_fn function, void *arg, int stacksize, int prio)
  157. {
  158.   osThreadAttr_t attr;
  159.   osThreadId_t   id;

  160.   memset (&attr, 0, sizeof(attr));
  161.   attr.name       = name;
  162.   attr.stack_size = (uint32_t)stacksize;
  163.   attr.priority   = (osPriority_t)prio;

  164.   id = osThreadNew(function, arg, &attr);
  165.   return id;
  166. }

  167. /* Time */
  168. u32_t sys_now()
  169. {
  170.   return (tick2ms(osKernelGetTickCount()));
  171. }

  172. u32_t sys_jiffies()
  173. {
  174.   return (osKernelGetTickCount());
  175. }

  176. /* Critical sections */
  177. #if SYS_LIGHTWEIGHT_PROT

  178. sys_prot_t sys_arch_protect(void)
  179. {
  180.   sys_prot_t pval;

  181.   pval = osKernelLock();
  182.   return pval;
  183. }

  184. void sys_arch_unprotect(sys_prot_t pval)
  185. {
  186.   osKernelRestoreLock (pval);
  187. }

  188. #endif /* SYS_LIGHTWEIGHT_PROT */

  189. void sys_init(void)
  190. {
  191.   tick_freq = osKernelGetTickFreq ();
  192.   if (tick_freq > 990U && tick_freq < 1010U) {
  193.     // No scaling for 1ms ticks
  194.     tick_freq = 0U;
  195.   }
  196. }

  197. #endif /* !NO_SYS */
复制代码


回复

使用道具 举报

608

主题

3043

回帖

4887

积分

至尊会员

积分
4887
 楼主| 发表于 2020-4-28 09:52:32 | 显示全部楼层
eric2013 发表于 2020-4-28 09:47
你搞得那个封装层版呢,这个封装层版的好用。

你提供的这个封装层,在 embOS + Lwip 上使用不行,我已经测试过了的,所以后来只能使用 embOS 的原型函数 就可以

embOS 提供的 v2 封装层,我目前使用 除了 那个 创建任务函数可以正常使用外,其他的 v2 封装层都不行啊,目前也不知道到底是咋回事

你目前提供的这个封装层 貌似在 rtx 上使用效果是非常好的哟
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-28 09:53:59 | 显示全部楼层
hpdell 发表于 2020-4-28 09:52
你提供的这个封装层,在 embOS + Lwip 上使用不行,我已经测试过了的,所以后来只能使用 embOS 的原型函 ...

得给SEGGER反馈,做个更好的封装层。

这个封装层在RTX5和FreeRTOS下都好用。
回复

使用道具 举报

608

主题

3043

回帖

4887

积分

至尊会员

积分
4887
 楼主| 发表于 2020-4-28 09:58:09 | 显示全部楼层
eric2013 发表于 2020-4-28 09:53
得给SEGGER反馈,做个更好的封装层。

这个封装层在RTX5和FreeRTOS下都好用。

1. segger 洋文太多,要不托付你 去 segger 反馈一下啊 ?

2. 你提供的封装层 在 rtx5 , FreeRTOS 系统下确实是好用的
回复

使用道具 举报

608

主题

3043

回帖

4887

积分

至尊会员

积分
4887
 楼主| 发表于 2020-4-28 10:03:42 | 显示全部楼层
eric2013 发表于 2020-4-28 09:53
得给SEGGER反馈,做个更好的封装层。

这个封装层在RTX5和FreeRTOS下都好用。

貌似发现这个 embOS 的提供的 消息邮箱,os 系统内部 貌似不会 自动 循环使用,这样就容易造成 内存泄漏的问题了,还有 这个 系统,说起来是占用 系统资源小,但是实际使用 貌似需要的 任务 堆栈也不小啊,貌似比 ucos, freertos 还大啊
回复

使用道具 举报

608

主题

3043

回帖

4887

积分

至尊会员

积分
4887
 楼主| 发表于 2020-4-28 21:04:01 | 显示全部楼层
eric2013 发表于 2020-4-28 09:53
得给SEGGER反馈,做个更好的封装层。

这个封装层在RTX5和FreeRTOS下都好用。

现在貌似在没有连接上网络运行一会就会出现如下错误

System Handler Control and State Register = 0x10000 , Addr = 0xE000ED24
Memory Fault Status Register = 0x0 , Addr = 0xE000ED28
Bus Fault Status Register = 0x1 , Addr = 0xE000ED29
Bus Fault Manage Address Register = 0x0 , Addr = 0xE000ED38
Usage Fault Status Register = 0x0 , Addr = 0xE000ED2A
Hard Fault Status Register = 0x40000000 , Addr = 0xE000ED2C
Debug Fault Status Register = 0x0 , Addr = 0xE000ED30
Auxiliary Fault Status Register = 0x0 , Addr = 0xE000ED3C


这些个地址 的介绍在哪里可以查看啊 ???
回复

使用道具 举报

608

主题

3043

回帖

4887

积分

至尊会员

积分
4887
 楼主| 发表于 2020-4-28 23:06:46 | 显示全部楼层
貌似使用 embOS + Lwip 的人民很少哇
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-29 10:21:19 | 显示全部楼层
hpdell 发表于 2020-4-28 09:58
1. segger 洋文太多,要不托付你 去 segger 反馈一下啊 ?

2. 你提供的封装层 在 rtx5 , FreeRTOS 系 ...

SEGGER这块好像国内专门有人搜集这方面的问题,给他们反馈。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-29 10:26:27 | 显示全部楼层
hpdell 发表于 2020-4-28 21:04
现在貌似在没有连接上网络运行一会就会出现如下错误

System Handler Control and State Register = 0x ...

QQ截图20200429102605.png
回复

使用道具 举报

608

主题

3043

回帖

4887

积分

至尊会员

积分
4887
 楼主| 发表于 2020-4-29 21:06:04 | 显示全部楼层

这个中断地址,有没有具体的相关介绍啊 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2020-4-30 07:47:27 | 显示全部楼层
hpdell 发表于 2020-4-29 21:06
这个中断地址,有没有具体的相关介绍啊 ?

在私有外设,这个要翻翻编程手册,或者权威指南。
回复

使用道具 举报

608

主题

3043

回帖

4887

积分

至尊会员

积分
4887
 楼主| 发表于 2020-5-5 20:10:52 | 显示全部楼层
本帖最后由 hpdell 于 2020-5-7 09:56 编辑
eric2013 发表于 2020-4-30 07:47
在私有外设,这个要翻翻编程手册,或者权威指南。

终于 搞定了, 目前基本可以正常使用了,
不过还有个小 小的 bug, 不影响正常使用

上传 来备份或者供后续需要者 提供参考,

已目前的水准 也只能这样了, 后续看看哪位高人 改 好 改 完美哟

sys_arch.h (2.25 KB, 下载次数: 5)

sys_arch.c (17.28 KB, 下载次数: 9)

目前已知 bug ,
说明: 已知问题
      a. 开发板设置为 客户端, 如果 远程 服务器端没有连接 开发板 客户端, 会出现
         lwip v2.1.2
         1. Assertion "p != NULL" failed at line 732 in ..\Middlewares\Third_Party\LwIP\src\core\pbuf.c   
            出现这个貌似也不会影响正常使用
         2. 可以在底层 把这句 删除掉即可, 不删除也不会影响正常使用, 出现这句提示的原因,主要是
            sys_mbox_valid 这个函数还没有完全正常搞好造成的吧?                  
      b. 开发板设置为 服务器, 工作正常, 也没有任何异常提示
c. 图片, 图片中消息显示, mobx 的 新建, 释放, 还有信号量的 新建, 释放 都是 正常的
xxxx.png




回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2023-7-18 18:04:01 | 显示全部楼层
牛逼大佬
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-26 15:21 , Processed in 0.218719 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表