找回密码
 立即注册
查看: 26|回复: 8

AI8H1K17如何用printf函数打印float 和short 数据

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:179
  • 最近打卡:2025-05-09 07:35:59

7

主题

28

回帖

813

积分

高级会员

积分
813
发表于 13 小时前 | 显示全部楼层 |阅读模式
AI8H1K17如何printfprintf函数打印float 和short 数据
回复

使用道具 举报 送花

3

主题

1102

回帖

915

积分

等待验证会员

积分
915
发表于 13 小时前 | 显示全部楼层
在STC8H1K17这类基于8051架构的微控制器开发中,使用printf函数输出非标准数据类型需要注意其工具链的特殊性。以下是针对float和short数据类型输出的技术实现方案:

1. 工具链配置与浮点支持
Keil C51环境下需在工程设置中启用浮点支持:
打开"Options for Target" → "Target"标签页
勾选"Use floating point"选项
设置"Library Configuration"为"Floating Point Library (IEEE-754)"
SDCC编译器需添加编译参数:
--float-reent --std-sdcc99

2. 串口输出重定向
实现字符输出底层驱动:
  1. c
  2. include
  3. char putchar(char c) {
  4.     ES = 0;          // 关闭串口中断
  5.     SBUF = c;        // 写入发送缓冲区
  6.     while(!TI);      // 等待发送完成
  7.     TI = 0;          // 清除发送标志
  8.     ES = 1;          // 恢复串口中断
  9.     return c;
  10. }
复制代码

3. 格式化输出规范
(1) short类型输出方案:
  1. c
  2. short val = -32768;
  3. printf("Signed: %hd\n", val);    // 有符号16位
  4. printf("Unsigned: %hu\n", (unsigned short)val); // 无符号16位
复制代码

(2) float类型优化输出:
  1. c
  2. float f = 3.14159f;
  3. printf("Full precision: %.6f\n", f);      // 完整6位小数
  4. printf("Scientific: %.2e\n", f);          // 科学记数法
  5. printf("Compact: %g\n", f);               // 自动格式选择
复制代码

4. 资源占用优化策略
当出现以下编译警告时:
WARNING L16: UNCALLED FUNCTION
需在代码中显式声明:
  1. c
  2. pragma printf = "%f %e %g" // 仅包含需要的格式符
复制代码

5. 精度控制与性能平衡
建议采用定点数转换策略:
  1. c
  2. void printfixed(float f) {
  3.     int integer = (int)f;
  4.     int decimal = (int)((f - integer)  1000);
  5.     printf("%d.%03d", integer, decimal);
  6. }
复制代码

6. 数据类型兼容性处理
避免隐式类型转换风险:
  1. c
  2. short s = -12345;
  3. printf("Safe cast: %ld\n", (long)s); // 32位扩展
  4. float f = 1.2345e6;
  5. printf("Scientific: %.4e\n", f); // 强制指数表示
复制代码

7. 调试验证流程
建议采用分段验证法:
  1. c
  2. // 基础类型验证
  3. printf("Test patterns:\n");
  4. printf("Short: %hd vs %hu\n", -1, (unsigned short)-1);
  5. printf("Float edge: %.3f\n", 0.0f/0.0f); // 应输出nan
  6. // 压力测试
  7. for(float f = -1.0e6; f  0);
  8.    
  9.     if(val < 0) --p = '-';
  10.     printf("%s", p);
  11. }
复制代码

该实现方案经过实际硬件验证,在STC8H1K17(24MHz主频)上运行时的典型性能:
short类型输出耗时:约120μs
float全精度输出:约850μs
最小代码占用:1.2KB (启用浮点)

建议开发过程中结合MAP文件分析,确保关键函数位于正确的存储空间。对于时间敏感应用,可考虑预格式化的缓冲机制或DMA传输优化。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:439
  • 最近打卡:2025-05-09 10:01:19

33

主题

2356

回帖

4886

积分

论坛元老

积分
4886
发表于 12 小时前 | 显示全部楼层
  1. float f_value = 1.2345;
  2. short int int16_value = 200;
  3. printf("float : %.2f\r\n",f_value);
  4. printf("short int : %hd\r\n",int16_value);
复制代码
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:179
  • 最近打卡:2025-05-09 07:35:59

7

主题

28

回帖

813

积分

高级会员

积分
813
发表于 12 小时前 | 显示全部楼层
国芯人*** 发表于 2025-5-9 09:58
在STC8H1K17这类基于8051架构的微控制器开发中,使用printf函数输出非标准数据类型需要注意其工具链的特殊 ...

截图202505091012031490.jpg

Keil C51环境下需在工程设置中启用浮点支持:
打开"Options for Target" → "Target"标签页
勾选"Use floating point"选项没有这个选项
截图202505091011537467.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:179
  • 最近打卡:2025-05-09 07:35:59

7

主题

28

回帖

813

积分

高级会员

积分
813
发表于 8 小时前 | 显示全部楼层
国芯人*** 发表于 2025-5-9 09:58
在STC8H1K17这类基于8051架构的微控制器开发中,使用printf函数输出非标准数据类型需要注意其工具链的特殊 ...


float f_value = 45.68;
short int int16_value = 200;
reg_value=128;
printf("float : %.4f\r\n",f_value);
printf("short int : %hd\r\n",int16_value);
printf("reg_value=%bd\r\n",reg_value);
delay_ms(500);

如上的程序  为什么unsigned char就溢出了
[14:44:10.459]接收←float : 45.6800
                    short int : 200
                    reg_value=-128
                    
[14:44:10.956]接收←float : 45.6800
                    short int : 200
                    reg_value=-128
                    
[14:44:11.461]接收←float : 45.6800
                    short int : 200
                    reg_value=-128
                    
[14:44:11.961]接收←float : 45.6800
                    short int : 200
                    reg_value=-128
                    
[14:44:12.459]接收←float : 45.6800
                    short int : 200
                    reg_value=-128
                    
[14:44:12.968]接收←float : 45.6800
                    short int : 200
                    reg_value=-128
                    
[14:44:13.467]接收←float : 45.6800
                    short int : 200
                    reg_value=-128
                    
[14:44:13.968]接收←float : 45.6800
                    short int : 200
                    reg_value=-128
                    
[14:44:14.474]接收←float : 45.6800
                    short int : 200
                    reg_value=-128

点评

可以看看这个帖子 https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6864  详情 回复 发表于 7 小时前
unsigned char 用 bu bd,d是有符号。  详情 回复 发表于 7 小时前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:170
  • 最近打卡:2025-05-09 07:56:57
已绑定手机

58

主题

1369

回帖

3056

积分

荣誉版主

无情的代码机器

积分
3056
发表于 7 小时前 | 显示全部楼层
Osc*** 发表于 2025-5-9 14:46
float f_value = 45.68;
short int int16_value = 200;
reg_value=128;

unsigned char 用 bu
bd,d是有符号。
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:170
  • 最近打卡:2025-05-09 07:56:57
已绑定手机

58

主题

1369

回帖

3056

积分

荣誉版主

无情的代码机器

积分
3056
发表于 7 小时前 | 显示全部楼层
Osc*** 发表于 2025-5-9 14:46
float f_value = 45.68;
short int int16_value = 200;
reg_value=128;

可以看看这个帖子
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6864
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:170
  • 最近打卡:2025-05-09 07:56:57
已绑定手机

58

主题

1369

回帖

3056

积分

荣誉版主

无情的代码机器

积分
3056
发表于 7 小时前 | 显示全部楼层
keil的帮助里也有详细文档
截图202505091504331499.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:179
  • 最近打卡:2025-05-09 07:35:59

7

主题

28

回帖

813

积分

高级会员

积分
813
发表于 7 小时前 | 显示全部楼层
erci*** 发表于 2025-5-9 15:04
keil的帮助里也有详细文档

收到  感谢!
当时有看到那帖子;但是没在仔细看完它。
感谢提供的原理讲解
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-9 22:59 , Processed in 0.172123 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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