搜索
bottom↓
回复: 3

请教一下RT-Thread 中断的栈空间问题

[复制链接]

出0入0汤圆

发表于 2010-12-28 15:17:29 | 显示全部楼层 |阅读模式
我是RTT的初学者,刚看完了《编程指南》,现在在看串口部分的源代码。RTT把串口封装成了一个CHAR设备,在接受中断时,调用了serial.c文件中的rt_hw_serial_isr()函数,这个函数有两个局部变量:
        struct stm32_serial_device* uart = (struct stm32_serial_device*) device->private;
        struct stm32_serial_int_rx* int_rx = uart->int_rx;

如果我的接收缓存区设的很大比如4Kbyte,那么int_rx变量占用的空间就会很大,那这个串口接收中断的服务函数会不会栈溢出呢?我知道建立一个线程时,需要分配栈空间,但没注意到《编程手册》中关于中断服务函数的栈设置是怎么设置的。

我的应用需要一次接收较大的数剧(有时会接收图像数据),数据量大的时候可以到2k-4k。我想请教一下怎么编程会更加合理?我看到rt_hw_serial_isr()中有关中断和开中断的操作,那么我能不能修改一下函数,不用局部变量,而直接用全局变量呢?
或者我再创建一个线程,没接收10个字节数据就将接收缓存区的数据copy到一个新的较大的缓存中(全局变量)?由于从未采用过这种方式,我担心转移的时间大于串口发送的时间(我用的是9600波特率),不知道这种方式是否可行?

请教各位大大,那种方式更好更合理呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-12-28 15:31:01 | 显示全部楼层
哦,我有点明白了,其实我可以不拘泥于例程。rt_hw_serial_isr()是一个通用的程序,我完全可以在串口中断中编写自己需要的功能。只要注_册了串口后,在相应的串口中断中分别编写中断服务函数。usart1用usart1_IRQ(),usart2用usart2_IRQ()。用全局变量也好,用其他方式也好,根据需要自己定义。

出0入0汤圆

发表于 2010-12-28 23:00:31 | 显示全部楼层
函数有两个局部变量:
struct stm32_serial_device* uart = (struct stm32_serial_device*) device->private;
struct stm32_serial_int_rx* int_rx = uart->int_rx;

这里仅两个指针的,不会占用太大的栈空间。

STM32/CM3中的中断栈设置是在start_rvds.S中设置的,Keil打开这个文件会有提示。

出0入0汤圆

 楼主| 发表于 2010-12-29 09:11:36 | 显示全部楼层
对对,是两个指针,哈哈,我糊涂了~~~~

这回丢了人了啊,哈哈。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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