硬汉嵌入式论坛

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

[技术讨论] ucos下使用swprintf出错

[复制链接]

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
发表于 2021-1-7 12:50:51 | 显示全部楼层 |阅读模式
有用过 swprintf()函数的吗pbuf0 = (wchar_t *)malloc(0x50);

swprintf(pbuf0, 0xA0,  L": %.1f", 32.33f);
这样打印出来的pbuf0中wchar_t字符串不对啊,不是 32.33。

试了好久,也不知道是什么原因引起的。
放在main里面运行,就正常。
放在一个任务里面,就不对了,加大了任务堆栈,或是全局堆栈,也没解决啊
头大
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
发表于 2021-1-7 12:58:51 | 显示全部楼层
如果不正常,大概率你任务栈的8字节对齐没有做好

现在网上各种uCOS的移植工程,没有把握住栈空间8字节对齐的精髓
http://www.armbbs.cn/forum.php?m ... 9001&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
 楼主| 发表于 2021-1-7 14:18:13 | 显示全部楼层
eric2013 发表于 2021-1-7 12:58
如果不正常,大概率你任务栈的8字节对齐没有做好

现在网上各种uCOS的移植工程,没有把握住栈空间8字节对 ...

貌似不是这个原因啊。改了之后还是一样的。用swprintf,sprintf都是错误的

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
发表于 2021-1-7 14:45:06 | 显示全部楼层
jplzl10000 发表于 2021-1-7 14:18
貌似不是这个原因啊。改了之后还是一样的。用swprintf,sprintf都是错误的

看来你的工程废了,使用我的吧:

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
 楼主| 发表于 2021-1-7 15:46:13 | 显示全部楼层
eric2013 发表于 2021-1-7 14:45
看来你的工程废了,使用我的吧:

http://www.armbbs.cn/forum.php?mod=viewthread&tid=11814&extra=pa ...

这么严重,工程废了是啥意思 。。。 就是莫名其妙的问题多?
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
发表于 2021-1-7 21:13:14 | 显示全部楼层
jplzl10000 发表于 2021-1-7 15:46
这么严重,工程废了是啥意思 。。。 就是莫名其妙的问题多?

这是由于你使用了需要满足AAPCS的函数,需要满足调用规则要求。详细可以看看权威指南的双字的堆栈对齐方式一节,95%能解决你的问题。http://www.armbbs.cn/forum.php?m ... d=101254&extra=
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
发表于 2021-1-8 08:32:28 | 显示全部楼层
jplzl10000 发表于 2021-1-7 15:46
这么严重,工程废了是啥意思 。。。 就是莫名其妙的问题多?

就是你的模板做的不太好。
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
 楼主| 发表于 2021-1-9 12:48:24 | 显示全部楼层
庄永 发表于 2021-1-7 21:13
这是由于你使用了需要满足AAPCS的函数,需要满足调用规则要求。详细可以看看权威指南的双字的堆栈对齐方 ...

好像也不是这个问题。
我看了下 .map文件
STACK                                    0x2000f238
Stack_Mem                                0x2000f238
__initial_sp                             0x2000f638
这应该是8字节对齐吧
启动的.s文件中也设置了8字节对齐,好像都是默认设置的
AREA    STACK, NOINIT, READWRITE, ALIGN=3
AREA    HEAP, NOINIT, READWRITE, ALIGN=3

换了ucos-ii的源码好像就好了。原来的源码是用在L152上面的。
大概看了下,和 eric2013 大佬提供的有些差别,还没去细看
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
 楼主| 发表于 2021-1-9 13:08:57 | 显示全部楼层
用的V4中ucos的那个printf例程,
3个任务的堆栈也都不是8字节对齐啊
OS_STK TASK_START_STK[400];        //
OS_STK TaskShow_stack[1000];        //
TASK_START_STK                           0x200010b4
TaskShow_stack                           0x200016f4
使用swprintf()居然也是正常的
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
发表于 2021-1-9 14:39:15 | 显示全部楼层
jplzl10000 发表于 2021-1-9 12:48
好像也不是这个问题。
我看了下 .map文件
STACK                                    0x2000f238

还是在你原来的UCOSIII工程,在启动文件开始加上如下语句使能CM3双字对齐配置选项看看:
LDR R0, = 0xE000ED14
LDR R1, [R0]
ORR.W R1,R1,#0x200
STR  R1,[R0]
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
 楼主| 发表于 2021-1-9 15:16:46 | 显示全部楼层
eric2013 发表于 2021-1-8 08:32
就是你的模板做的不太好。

我参考 V4-819_uCOS-II实验_uCOS-II+STemWin+FatFs综合
这个例程里面的 fatfs,好像是不支持长文件名/中文名的哈
把#define        _USE_LFN        0         /* 0 to 3 【由0 修改 2,支持长文件名,使用堆栈保存】*/
这个定义改成 2 后编译出错
ff_convert() 和 ff_wtoupper()未定义
有没有fatfs支持长文件名的参考工程啊
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
 楼主| 发表于 2021-1-9 15:24:32 | 显示全部楼层
庄永 发表于 2021-1-9 14:39
还是在你原来的UCOSIII工程,在启动文件开始加上如下语句使能CM3双字对齐配置选项看看:
LDR R0, = 0xE0 ...

一样的,是错误的,不过有点不同就是。以前每次都是 0.00
这次改成了一长串。
感觉应该不是对齐的问题,就是ucos的源码问题。
反正现在是换了源码就好了
回复

使用道具 举报

262

主题

578

回帖

1364

积分

至尊会员

积分
1364
 楼主| 发表于 2021-1-9 15:25:33 | 显示全部楼层
庄永 发表于 2021-1-9 14:39
还是在你原来的UCOSIII工程,在启动文件开始加上如下语句使能CM3双字对齐配置选项看看:
LDR R0, = 0xE0 ...

兄弟还是挺牛逼的啊,还会用汇编操作寄存器
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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