[STM32F1] 8位数组的200个数据怎么快速转换成16位数组100储存?

[复制链接]
4644|37
 楼主| 电子过客 发表于 2016-7-13 13:18 | 显示全部楼层 |阅读模式
假如有个u8  a[200]里变得数组怎么 快速 转移到 u16 [100] 里
有什么好的方法吗?                         

JasonWangSE 发表于 2016-7-13 13:25 | 显示全部楼层
本帖最后由 JasonWangSE 于 2016-7-13 13:27 编辑

要是可以改定义就改成union;要是只能拷贝就调memcpy呗,一般库函数都会做优化的,或者用把DMA,不过才200字节有些用牛刀了。。。
xyz549040622 发表于 2016-7-13 13:40 | 显示全部楼层
JasonWangSE 发表于 2016-7-13 13:25
要是可以改定义就改成union;要是只能拷贝就调memcpy呗,一般库函数都会做优化的,或者用把DMA,不过才200 ...

再来就是老老实实的移位,组成新数据了。
yklstudent 发表于 2016-7-13 13:52 | 显示全部楼层
要大端还是小端,然后强制转换赋值;
uint8_t lubTxBuffer[200];
uint16_t luwTxBuffer[100];
uint8_t i;
       
for(i=0; i<200; i++)
{
        lubTxBuffer[i] = i;
}
for(i=0; i<100; i++)
{
        luwTxBuffer[i] = *(uint16_t*)(&lubTxBuffer[i*2]);
}
 楼主| 电子过客 发表于 2016-7-13 14:20 | 显示全部楼层
JasonWangSE 发表于 2016-7-13 13:25
要是可以改定义就改成union;要是只能拷贝就调memcpy呗,一般库函数都会做优化的,或者用把DMA,不过才200 ...

关键这是一个举例子
定义u8 a[200] 存储到时 u 16[0----100]
u8 c[200]存储到 u16 b  16[101----200]
等等好多的
JasonWangSE 发表于 2016-7-13 14:30 | 显示全部楼层
电子过客 发表于 2016-7-13 14:20
关键这是一个举例子
定义u8 a[200] 存储到时 u 16[0----100]
u8 c[200]存储到 u16 b  16[101----200]

啥意思,没看懂
 楼主| 电子过客 发表于 2016-7-13 15:19 | 显示全部楼层

假如u16  b[ 500]
u8   a[200]   数据储存到    u16  b[ 0 -99]:
u8   c[200]   数据储存到    u16  b[ 100 -199]:
u8   d[200]   数据储存到    u16  b[ 200 -299]:
u8   e[200]   数据储存到    u16  b[ 300 -399]:
.....
JasonWangSE 发表于 2016-7-13 15:43 | 显示全部楼层
电子过客 发表于 2016-7-13 15:19
假如u16  b[ 500]
u8   a[200]   数据储存到    u16  b[ 0 -99]:
u8   c[200]   数据储存到    u16  b[  ...

memcpy性能达不到要求么?不行就试试DMA吧
airwill 发表于 2016-7-13 18:41 | 显示全部楼层
用强制转换, 啥都不用做了.
mmuuss586 发表于 2016-7-13 19:56 | 显示全部楼层
用联合体,共用地址;
戈卫东 发表于 2016-7-13 19:59 | 显示全部楼层
让一个U16 *得到数组的地址就可以了
justtest111 发表于 2016-7-13 20:19 | 显示全部楼层
戈卫东 发表于 2016-7-13 19:59
让一个U16 *得到数组的地址就可以了

也需要考虑大小端的吧?
runningwzf 发表于 2016-7-13 21:30 | 显示全部楼层
强制指针转换
ianhom 发表于 2016-7-13 22:36 | 显示全部楼层
要看大小端
949155525 发表于 2016-7-13 23:17 来自手机 | 显示全部楼层
共用体
山东电子小菜鸟 发表于 2016-7-13 23:28 | 显示全部楼层
看了一下楼上各位大神的回答,都非常专业,但是我认为最简单的算法是如下:
unsigned char a[200];
unsigned int   b[100];
for(unsigned char i=0;i<100;i++)
{
b[i]=(unsigned int)((a[i]<<8)|a[i+1]);//或者b[i]=(unsigned int)((a[i+1]<<8)|a[i]);

}
就是如此的简单,楼上各位大神搞的好复杂呀

评论

用联合体是最简单的  发表于 2016-7-14 08:37
zyj9490 发表于 2016-7-13 23:46 | 显示全部楼层
山东电子小菜鸟 发表于 2016-7-13 23:28
看了一下楼上各位大神的回答,都非常专业,但是我认为最简单的算法是如下:
unsigned char a[200];
unsigne ...

你的最大问题占用大量的RAM,给变量。
山东电子小菜鸟 发表于 2016-7-14 00:04 | 显示全部楼层
哈哈  无论什么方法都需要开辟u8 a[200], u16 b[100]空间的,你如果想存数据 必须开辟RAM空间,难道你有不需要空间存储变量的方法吗

评论

联合体,呵呵!  发表于 2016-7-14 08:40
menfiss 发表于 2016-7-14 07:30 来自手机 | 显示全部楼层
看样子可以用联合体吧
LearningASM 发表于 2016-7-14 08:37 | 显示全部楼层
u8  a[200]以什么样的形式变成 u16 b[100] ??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

210

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部