嵌入式C语言编程问题

嵌入式系统的编程问题

img

如图所示是一个EM4102 集成电路的帧,该框架由 64 位组成,其中:
— 逻辑级别 1 的 9 个首部(由于奇偶校验位的存在,在帧的其他地方无法找到);
— 8 位表示制造商标识(D00 到 D13);
— 32 个数据位(D20 到 D93);
— 10 个水平奇偶校验位(P0 到 P9)
— 4 个垂直奇偶校验位(PC0 到 PC3)
— 逻辑电平 0 (S0) 的 1 个停止位。

1.编写一个函数,该函数给出首部第一位的位置,如果未找到首部则为 –1(考虑模运算)。
2.编写一个函数,该函数根据传输的帧(首部优先)对 64 个记录位进行排序。
3.编写一个测试接收帧的所有奇偶校验位的函数。

img

第一个问题已经写出来了,如图所示,后两个问题实在弄不明白

六十四个引脚怎样和单片机连接?找到每条信号线输入输出的连接方式才能确定数组中各个位的含义,然后才能编写函数

写个函数排序,和写个奇偶检验位

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;
}