硬汉嵌入式论坛

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

[RL-RTX] 关于消息邮箱的一点疑问

[复制链接]

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-3-20 18:09:06 | 显示全部楼层 |阅读模式
1.首先我定义了消息邮箱,发现不调用os_mbx_init (&udpmailbox, sizeof(udpmailbox));也是可以正常使用邮箱的。(偶然发现的),这是为啥呢?
2.RTX的消息邮箱是传递地址的,假设我要传递一个数组(最长数据100字节),我将数组名字传递出去就可以了。我配合UDP接收回调函数使用,看下图解释: 1.jpg
理论上我是不是必须使用一个数组进行转存一下,然后邮箱发送的是数组的地址,而不是使用函数udp_callback这个函数的参数。
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
 楼主| 发表于 2019-3-20 18:09:55 | 显示全部楼层
最近问题有点多,希望老大及各位网友在百忙之中帮忙解答一下,不胜感激!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106683
QQ
发表于 2019-3-20 18:27:24 | 显示全部楼层
sanit 发表于 2019-3-20 18:09
最近问题有点多,希望老大及各位网友在百忙之中帮忙解答一下,不胜感激!

1、邮箱初始化是这个函数
1.jpg

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

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


回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
 楼主| 发表于 2019-3-20 19:29:53 | 显示全部楼层
eric2013 发表于 2019-3-20 18:27
1、邮箱初始化是这个函数


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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106683
QQ
发表于 2019-3-21 00:25:26 | 显示全部楼层
sanit 发表于 2019-3-20 19:29
这个os_开头的是通过SVC中断调用rt_开头的,这样跟直接调用rt_开头的有啥区别呢?他们之间是否存在本 ...

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

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 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相关代码永远不会产生重入的风险
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-3-23 12:57:43 | 显示全部楼层
你没必要这么做,buf在传递参数时候,已经传递了数组的首地址,这是c语言参数传递的约定,即数组虽然是一种类型,但是数组名作为参数传递时只传递首地址,结构体这种事可以传递全部内容
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
 楼主| 发表于 2019-3-23 19:28:50 | 显示全部楼层
myxiaonia 发表于 2019-3-23 12:57
你没必要这么做,buf在传递参数时候,已经传递了数组的首地址,这是c语言参数传递的约定,即数组虽然是一种 ...

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

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-3-24 16:09:25 | 显示全部楼层
sanit 发表于 2019-3-23 19:28
实验发现不可以直接将那个buf传递出去的,因为那个函数调用完毕之后,那个内存会被释放,其他网络数据可 ...

难道你是用临时变量数组传递参数,这当然不对了,生存期不对呀
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 12:29 , Processed in 0.186627 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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