sanit 发表于 2019-3-20 18:09:06

关于消息邮箱的一点疑问

1.首先我定义了消息邮箱,发现不调用os_mbx_init (&udpmailbox, sizeof(udpmailbox));也是可以正常使用邮箱的。(偶然发现的),这是为啥呢?
2.RTX的消息邮箱是传递地址的,假设我要传递一个数组(最长数据100字节),我将数组名字传递出去就可以了。我配合UDP接收回调函数使用,看下图解释:
理论上我是不是必须使用一个数组进行转存一下,然后邮箱发送的是数组的地址,而不是使用函数udp_callback这个函数的参数。

sanit 发表于 2019-3-20 18:09:55

最近问题有点多,希望老大及各位网友在百忙之中帮忙解答一下,不胜感激!

eric2013 发表于 2019-3-20 18:27:24

sanit 发表于 2019-3-20 18:09
最近问题有点多,希望老大及各位网友在百忙之中帮忙解答一下,不胜感激!
1、邮箱初始化是这个函数


2、这种的推荐发送前使用RTX的自带的那种动态内存申请(其实就是数组块申请)

用完了释放。TCPnet这个应该是用的他们自己的动态内存申请和释放的。
下面是接在中断函数



sanit 发表于 2019-3-20 19:29:53

eric2013 发表于 2019-3-20 18:27
1、邮箱初始化是这个函数






这个os_开头的是通过SVC中断调用rt_开头的,这样跟直接调用rt_开头的有啥区别呢?他们之间是否存在本质的区别呢?

eric2013 发表于 2019-3-21 00:25:26

sanit 发表于 2019-3-20 19:29
这个os_开头的是通过SVC中断调用rt_开头的,这样跟直接调用rt_开头的有啥区别呢?他们之间是否存在本 ...

这个是RTX实现零中断延迟的关键。一般uCOS和FreeRTOS的做法都是在源码里面做开关中断做临界保护。有中断延迟是不可避免的。

myxiaonia 发表于 2019-3-23 12:52:25

本帖最后由 myxiaonia 于 2019-3-23 12:59 编辑

sanit 发表于 2019-3-20 19:29
这个os_开头的是通过SVC中断调用rt_开头的,这样跟直接调用rt_开头的有啥区别呢?他们之间是否存在本 ...
os开头的都会在svc中断中执行相关任务,相当于比用户自己的代码高一个等级
中断中使用的是isr开头的,是把一个os操作注册到pendsv中断里,待所有中断都完成了os将会完成,相当于延迟操作,rtl.h里可以设置osfifo的数量,就是指可以存储的isr操作的深度

总结一下:普通任务代码提升等级来执行os代码,中断代码降低等级来保证中断的优先级,这两个操作保证os相关代码永远不会产生重入的风险

myxiaonia 发表于 2019-3-23 12:57:43

你没必要这么做,buf在传递参数时候,已经传递了数组的首地址,这是c语言参数传递的约定,即数组虽然是一种类型,但是数组名作为参数传递时只传递首地址,结构体这种事可以传递全部内容

sanit 发表于 2019-3-23 19:28:50

myxiaonia 发表于 2019-3-23 12:57
你没必要这么做,buf在传递参数时候,已经传递了数组的首地址,这是c语言参数传递的约定,即数组虽然是一种 ...

实验发现不可以直接将那个buf传递出去的,因为那个函数调用完毕之后,那个内存会被释放,其他网络数据可也覆盖的。必须另外开一个内存池用消息邮箱进行传递数据。

myxiaonia 发表于 2019-3-24 16:09:25

sanit 发表于 2019-3-23 19:28
实验发现不可以直接将那个buf传递出去的,因为那个函数调用完毕之后,那个内存会被释放,其他网络数据可 ...

难道你是用临时变量数组传递参数,这当然不对了,生存期不对呀
页: [1]
查看完整版本: 关于消息邮箱的一点疑问