嵌入式系统的编程问题
如图所示是一个EM4102 集成电路的帧,该框架由 64 位组成,其中:
— 逻辑级别 1 的 9 个首部(由于奇偶校验位的存在,在帧的其他地方无法找到);
— 8 位表示制造商标识(D00 到 D13);
— 32 个数据位(D20 到 D93);
— 10 个水平奇偶校验位(P0 到 P9)
— 4 个垂直奇偶校验位(PC0 到 PC3)
— 逻辑电平 0 (S0) 的 1 个停止位。
1.编写一个函数,该函数给出首部第一位的位置,如果未找到首部则为 –1(考虑模运算)。
2.编写一个函数,该函数根据传输的帧(首部优先)对 64 个记录位进行排序。
3.编写一个测试接收帧的所有奇偶校验位的函数。
第一个问题已经写出来了,如图所示,后两个问题实在弄不明白
六十四个引脚怎样和单片机连接?找到每条信号线输入输出的连接方式才能确定数组中各个位的含义,然后才能编写函数
写个函数排序,和写个奇偶检验位
1.编写一个函数,该函数给出首部第一位的位置,如果未找到首部则为 –1(考虑模运算)。
/* 查找key在数组arr中是否存在,若存在,返回第一次出现的位置,否则输出-1 */
int find(int arr[], int n, int key)
{
int i;
for(i=0; i<n; i++)
if(arr[i] == key)
return i;
return -1;
}
2.编写一个函数,该函数根据传输的帧(首部优先)对 64 个记录位进行排序。
void MergeSortNonR(int* data, int n)
{
int* tmp = (int*)malloc(sizeof(int) * n);// 开辟临时数组存储合并的数据
int gap = 1;// gap指每次合并的数组长度,先从最小的长度1开始
while (gap < n)// 控制合并数组的长度gap
{
for (int i = 0; i < n; i += gap * 2)// 遍历所有数,合并长度为gap的两两数组
{
int begin1 = i;
int end1 = i + gap - 1;// gap是数组长度,i + gap是第二个数组的起点
if (end1 >= n)// 当end1越界时,修正
end1 = n - 1;
int begin2 = i + gap;
if (begin2 >= n)// 当begin2越界时,说明该区间不存在,修正成一个不存在的区间
{
begin2 = 1;
end2 = 0;
}
int end2 = i + 2 * gap - 1;
if (end2 >= n)
end2 = n - 1;
int index = i;// index是tmp数组保存数据的起始位置
while (begin1 <= end1 && begin2 <= end2)
{
if (data[begin1] < data[begin2])
tmp[index++] = data[begin1++];
else
tmp[index++] = data[begin2++];
}
// 当一组数组遍历完,将另一组数拷贝到tmp中
while (begin1 <= end1)
tmp[index++] = data[begin1++];
while (begin2 <= end2)
tmp[index++] = data[begin2++];
}// end of for
//for循环后,数组中长度为gap的子数组有序,将tmp拷贝到原数组中,再次归并
memcpy(data, tmp, sizeof(int) * n);
gap *= 2;// gap为合并数组的长度,乘2更新gap
}// end of while
}
3编写一个测试接收帧的所有奇偶校验位的函数。
//奇校验 校验位是0时,数据位中应该有奇数个1;而校验位是1时,数据位应该有偶数个1
BOOL GetOddParityBit(UINT8 Data)//奇校验
{
UINT8 Count= 0;
UINT8 i;
BOOL ReturnValue = 0;
for(i=0;i<8;i++)
{
if(Data&0x01==0x01)
{
Count++;
}
Data=Data>>1;
}
if((Count&0x01)==0x01)//奇数个1
{
ReturnValue = 0;
}
else
{
ReturnValue = 1;
}
return ReturnValue;
}