当前位置: 首页 > news >正文

夺宝网站开发简体中文wordpress5.2下载

夺宝网站开发,简体中文wordpress5.2下载,公众号开发者工具是干嘛的,潍坊ui设计制作培训现在#xff0c;TCP/IP协议的应用无处不在。随着物联网的火爆#xff0c;嵌入式领域使用TCP/IP协议进行通讯也越来越广泛。在我们的相关产品中#xff0c;也都有应用#xff0c;所以我们结合应用实际对相关应用作相应的总结。 1、技术准备 我们采用的开发平台是STM32F407…现在TCP/IP协议的应用无处不在。随着物联网的火爆嵌入式领域使用TCP/IP协议进行通讯也越来越广泛。在我们的相关产品中也都有应用所以我们结合应用实际对相关应用作相应的总结。 1、技术准备 我们采用的开发平台是STM32F407和LwIP协议栈。在开始之前我们需要做必要的准备工作。 首先要获得LwIP的源码在网上有很多不同版本及不同平台的都有不过我们还是建议直接从官方网站获得。其官方网站如下 http://savannah.nongnu.org/projects/lwip/ 其次需要硬件平台我们采用了STM32F407ZGDM9161的网络接口方式这并不是必须的其他硬件平台也是一样的。 最后因为我们后面要在操作系统下移植采用的操作系统是FreeRTOS所以还需下载FreeRTOS的源码。同样建议从官网下载 https://www.freertos.org/index.html 2、LwIP简要说明 LwIP是一款免费的TCP/IP协议栈但它的功能趋势十分完备。LwIP 具有三种应用编程接口 API Raw API为原始的 LwIP API。它通过事件回调机制进行应用开发。该 API 提供了最好的性能和优化的代码长度但增加了应用开发的复杂性。Netconn API为高层有序 API需要实时操作系统 RTOS的支持 提供进程间通讯的方法。 Netconn API 支持多线程工作。BSD Socket API类似 Berkeley 的套接字 API 开发于 Netconn API 之上 。 对于以上三种接口前一种只需要裸机即可调用后两种需要操作系统才能调用。所以据此LwIP存在两种移植方式一是只移植内核此时应用程序的编写只能基于RAW/Callback API进行。二是移植内核和上层API此时应用程序编写可以使用3种API即RAW/Callback API、Sequential API和Socket API。 3、LwIP的带操作系统基本移植 带操作系统的移植首先是建立在无操作系统移植基础之上的。在无操作系统移植时定义的数据类型和宏都是有效的只需要对lwipopts.h配置文件做简单修改并根据sys_arch.txt移植说明文件编写sys_arch.c和sys_arch.h两个文件以实现操作系统模拟层就可以了。 操作系统模拟层的功能再以为协议栈提供邮箱、信号量、互斥量等机制用以保证内核与上层API的通讯。这些操作系统模拟层函数均在sys.h中已经声明我们一般在sys_arch.c文件中完成其定义。所以我们很清楚带操作系统的移植就是在无操作系统的基础上添加操作系统模拟层。在接下来我们就看看操作系统模拟层的编写。 在操作系统已经正确移植的基础上我们根据sys_arch.txt移植说明文件的描述还需要移植的宏定义及函数等如下 名称 属性 功能 sys_mbox_t 数据类型 指针类型指向系统邮箱 sys_sem_t 数据类型 指针类型指向系统信号量 sys_mutex_t 数据类型 指针类型指向系统互斥量 sys_thread_t 数据类型 系统任务标识 SYS_MBOX_NULL 宏 邮箱指针指向的空值 SYS_SEM_NULL 宏 信号量指针指向的空值 sys_init 函数 初始化系统模拟层 sys_sem_new 函数 生成一个信号量 sys_sem_free 函数 删除一个信号量 sys_sem_signal 函数 释放一个信号量 sys_arch_sem_wait 函数 等待一个信号量 sys_sem_valid 函数 判断一个信号量是否有效 sys_sem_set_invalid 函数 将一个信号量置为无效 sys_mutex_new 函数 生成一个新的互斥量 sys_mutex_free 函数 删除一个互斥量 sys_mutex_lock 函数 锁住一个互斥量 sys_mutex_unlock 函数 解锁一个互斥量 sys_mutex_valid 函数 判断一个互斥量是否有效 sys_mutex_set_invalid 函数 将一个互斥量置为无效 sys_mbox_new 函数 新建一个邮箱 sys_mbox_free 函数 删除一个邮箱 sys_mbox_post 函数 向邮箱投递消息阻塞 sys_mbox_trypost 函数 尝试向邮箱投递消息不阻塞 sys_arch_mbox_fetch 函数 从邮箱获取消息阻塞 sys_arch_mbox_tryfetch 函数 尝试从邮箱获取消息不阻塞 sys_mbox_valid 函数 判断一个邮箱是否有效 sys_mbox_set_invalid 函数 将一个邮箱设置为无效 sys_thread_new 函数 创建新进程 sys_arch_protect 函数 临界区保护 sys_arch_unprotect 函数 退出临界区保护 从上表中我们可以发现这些变量和函数主要是面向信号量、互斥量及邮箱包括新建、删除、释放、获取等各类操作我们需要根据操作系统的规定来实现这些函数我们在这里使用的FreeRTOS所以我根据FreeRTOS对信号量、互斥量及邮箱的操作来实现这些函数。我们列举邮箱的各操作函数实现如下 /*创建一个空的邮箱。*/ err_t sys_mbox_new(sys_mbox_t *mbox, int size) {osMessageQDef(QUEUE, size, void *);*mbox osMessageCreate(osMessageQ(QUEUE), NULL);#if SYS_STATSlwip_stats.sys.mbox.used;if (lwip_stats.sys.mbox.max lwip_stats.sys.mbox.used) {lwip_stats.sys.mbox.max lwip_stats.sys.mbox.used;} #endif /* SYS_STATS */if (*mbox NULL)return ERR_MEM;return ERR_OK; }/*重新分配一个邮箱。如果邮箱被释放时邮箱中仍有消息在lwIP中这是出现编码错误的指示并通知开发人员。*/ void sys_mbox_free(sys_mbox_t *mbox) {if( osMessageWaiting(*mbox) ){/* Line for breakpoint.  Should never break here! */portNOP(); #if SYS_STATSlwip_stats.sys.mbox.err; #endif /* SYS_STATS */}osMessageDelete(*mbox);#if SYS_STATS--lwip_stats.sys.mbox.used; #endif /* SYS_STATS */ }/*发送消息到邮箱*/ void sys_mbox_post(sys_mbox_t *mbox, void *data) {while(osMessagePut(*mbox, (uint32_t)data, osWaitForever) ! osOK); }/*尝试将消息发送到邮箱*/ err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) { err_t result;if ( osMessagePut(*mbox, (uint32_t)msg, 0) osOK){result ERR_OK;}else {// could not post, queue must be fullresult ERR_MEM;#if SYS_STATSlwip_stats.sys.mbox.err; #endif /* SYS_STATS */}return result; }/*阻塞进程从邮箱获取消息*/ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) {osEvent event;uint32_t starttime osKernelSysTick();;if(timeout ! 0){event osMessageGet (*mbox, timeout);if(event.status osEventMessage){*msg (void *)event.value.v;return (osKernelSysTick() - starttime);}else{return SYS_ARCH_TIMEOUT;}}else{event osMessageGet (*mbox, osWaitForever);*msg (void *)event.value.v;return (osKernelSysTick() - starttime);} }/*尝试从邮箱获取消息*/ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) {osEvent event;event osMessageGet (*mbox, 0);if(event.status osEventMessage){*msg (void *)event.value.v;return ERR_OK;}else{return SYS_MBOX_EMPTY;} }/*判断一个邮箱是否有效*/ int sys_mbox_valid(sys_mbox_t *mbox)          {     if (*mbox SYS_MBOX_NULL)return 0;elsereturn 1; }/*设置一个邮箱无效*/                                              void sys_mbox_set_invalid(sys_mbox_t *mbox)   {                                            *mbox SYS_MBOX_NULL;                      }                                             //  创建一个新的信号量。而 count参数指示该信号量的初始状态 err_t sys_sem_new(sys_sem_t *sem, u8_t count) {osSemaphoreDef(SEM);*sem osSemaphoreCreate (osSemaphore(SEM), 1);if(*sem NULL){ #if SYS_STATSlwip_stats.sys.sem.err; #endif /* SYS_STATS */ return ERR_MEM;}if(count 0)  // Means it cant be taken{osSemaphoreWait(*sem,0);}#if SYS_STATSlwip_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 /* SYS_STATS */return ERR_OK; } 此外还有一些函数也是协议栈需要的函数特别是sys_thread_new函数不但协议栈在初始化是需要用到在后续我们实现各类基于LwIP的应用时也需要用到其实现如下 sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread , void *arg, int stacksize, int prio) {const osThreadDef_t os_thread_def { (char *)name, (os_pthread)thread, (osPriority)prio, 0, stacksize};return osThreadCreate(os_thread_def, arg); } osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument) {TaskHandle_t handle;#if( configSUPPORT_STATIC_ALLOCATION 1 )   ( configSUPPORT_DYNAMIC_ALLOCATION 1 )if((thread_def-buffer ! NULL) (thread_def-controlblock ! NULL)) {handle xTaskCreateStatic((TaskFunction_t)thread_def-pthread,(const portCHAR *)thread_def-name,thread_def-stacksize, argument, makeFreeRtosPriority(thread_def-tpriority),thread_def-buffer, thread_def-controlblock);}else {if (xTaskCreate((TaskFunction_t)thread_def-pthread,(const portCHAR *)thread_def-name,thread_def-stacksize, argument, makeFreeRtosPriority(thread_def-tpriority),handle) ! pdPASS)  {return NULL;}} #elif( configSUPPORT_STATIC_ALLOCATION 1 )handle xTaskCreateStatic((TaskFunction_t)thread_def-pthread,(const portCHAR *)thread_def-name,thread_def-stacksize, argument, makeFreeRtosPriority(thread_def-tpriority),thread_def-buffer, thread_def-controlblock); #elseif (xTaskCreate((TaskFunction_t)thread_def-pthread,(const portCHAR *)thread_def-name,thread_def-stacksize, argument, makeFreeRtosPriority(thread_def-tpriority),handle) ! pdPASS)  {return NULL;}     #endifreturn handle; } 至此基于FreeRTOS操作系统的LwIP移植结算完成了我们编译下载就可以对其进行验证。 4、结论 前面已经移植了基于操作系统的LwIP那怎么知道我们的移植是否成功呢接下来我们对它进行必要的验证。 首先我们查看目标板在网络上的配置是否正确。我们打开命令行窗口运行ipconfig命令查看MAC地址和IP地址配置 我们配置的MAC地址0008E1000000和IP地址192.168.2.110显示正常。接下来我们采用ping命令测试网络链接 上图显示网络连接正常经此测试说明我们的LwIP在有操作系统情况下移植正常。 欢迎关注
http://www.yutouwan.com/news/23819/

相关文章:

  • 广州网站建设+美词电子商务网站推广与建设论文
  • 如何备案成企业网站北京百度推广代理
  • 网站建设得花多钱宁波自助建站网站
  • 深圳有哪些做网站公司做养生网站需要资质吗
  • 网站建设 微信公众号梦创义网站建设公司
  • 哪里做网站比较快建设一个旅游网站毕业设计
  • 百度网站地图生成器seo推广专员
  • 怎么查看网站是否被百度惩罚降权或者被k外贸企业网站评价案例
  • 丰城网站建设公司软件开发工程师前景
  • 海城 网站建设小型影视网站源码
  • 如何进入网站后台地址晋江网站开发
  • 目前比较新的网站建设技术佛山新网站建设流程
  • 南充市住房建设局网站网站备案 信息查询
  • 绍兴seo整站优化长春企业平台
  • 买网站多少钱dw网站怎么做背景图
  • 自建站怎么推广游乐园网站建设
  • 如何防止网站被注册中国万网提供的服务和收费情况
  • html个人网站怎么做网站设计公司(信科网络)
  • 株洲定制网站建设网络营销推广的形式
  • 下花园区住房和城乡建设局网站做网站推广
  • 不需要验证码的注册网站网页模板建站系统
  • 发帖子最好的几个网站如何制作网站网页
  • 网站微信认证天津做网站需要多少钱
  • 江苏水利工程建设局网站go语言怎么搭建网页
  • 品牌网站建设e小蝌蚪移动网站开发框架
  • 百度站长seoc2c是什么平台
  • 衡阳有线宽带网站网站制作大概费用
  • 羽贝网站建设网站开发视频播放好做吗
  • 怎么建设网站容易被百度抓取中国工程建设标准网站
  • 网站上seo怎么做现在网站建设 如何保证安全