硬汉嵌入式论坛

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

[RL-RTX] 测试发现部分标准C库函数不可以在RTX开关中断之间的地方调用,比如printf

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2016-3-8 02:13:55 | 显示全部楼层 |阅读模式
应该是底层已经对printf做了多线程调用保护(采用RTX的互斥信号量实现),也就是前段时间发的这个帖子:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=17477
比如:
__set_PRIMASK(1);
printf("K1键按下,使用MDK中自带的RTX调试组件,请务必使用MDK4.74版本进行调试\r\n");
__set_PRIMASK(0);

上面这个printf问题的最根本原因是RTX的API函数在开关中断之间调用会触发硬件异常,这个不太清楚是怎么回事,调用RTX
的API会触发SVC中断,但是为什么在关闭中断后,触发SVC中断会出错呢,很奇怪。按说可以
等开启中断后再执行的,后面查查资料看。
比如:
__set_PRIMASK(1);
os_dly_wait(1);
__set_PRIMASK(0);
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2016-3-8 10:23:43 | 显示全部楼层
我这里使用的是标准C库,没有使用微库,因为用了FlashFS,FlashFS不支持微库,只能用标准C库。
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2016-3-8 14:03:41 | 显示全部楼层
svc触发时,必须立刻执行,关中断肯定要出错了,这个cm3权威指南早就说明了

只有一种情况,比如svc指令执行期间发生了高优先级中断,这个时候svc可以被正常的抢断而不触发错误
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2016-3-8 14:10:34 | 显示全部楼层

回 myxiaonia 的帖子

myxiaonia:svc触发时,必须立刻执行,关中断肯定要出错了,这个cm3权威指南早就说明了

只有一种情况,比如svc指令执行期间发生了高优先级中断,这个时候svc可以被正常的抢断而不触发错误 (2016-03-08 14:03) 
原来如此,好久没有研究这些了,谢谢告知。[s:142]
回复

使用道具 举报

12

主题

27

回帖

63

积分

初级会员

积分
63
发表于 2016-4-25 17:08:12 | 显示全部楼层
我在仿真的时候怎么使用printf这个函数,我需要初始化串口吗?我想在debug printf view里面看到数据
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2016-4-26 22:08:43 | 显示全部楼层
想使用printf,首先需要重定义相关函数,keil目录里有个retarget.c文件,就是干这事的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 01:37 , Processed in 0.218723 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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