ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
396656 Топик полностью
Любитель51 (23.03.2013 19:59, просмотров: 1) ответил Леонид Иванович на Достаточно выложить строчку на Си и во что она скомпилилась на ассемблере.
Извините, ассемблером не пользуюсь, версия IAR 6.40.2// Рабочий вариант программы/***********************************************************************************//uint8 basicRfBuildHeader(uint8* buffer, uint16 destAddr, uint8 payloadLength)uint8 basicRfBuildHeader(uint16 destAddr, uint8 payloadLength){ u8 i = 0; u8 k = 0; u16 d = 0; // Записать в буфер поле длины структуры, которое включает поле данных k = payloadLength + BASIC_RF_PACKET_OVERHEAD_SIZE; txMpdu[i++] = k; // Записать в буфер поле контроля структуры (FCF) d = pConfig->ackRequest ? BASIC_RF_FCF_ACK : BASIC_RF_FCF_NOACK; k = (u8)(d); // Младший значащий байт FCF txMpdu[i++] = k; k = (u8)(d >> 8); // Старший значащий байт FCF txMpdu[i++] = k; // Записать в буфер поле номер структуры SeqNumber k = txState.txSeqNumber; txMpdu[i++] = k; // Записать в буфер поле индекса сети PAN_ID d = pConfig->panId; k = (u8)(d); // Младший значащий байт PAN_ID txMpdu[i++] = k; k = (u8)(d >> 8); // Старший значащий байт PAN_ID txMpdu[i++] = k; // Записать в буфер поле адрес назначения Dest_Addr d = destAddr; k = (u8)(d >> 8); // Младший значащий байт Dest_Addr txMpdu[i++] = k; k = (u8)(d); // Старший значащий байт Dest_Addr txMpdu[i++] = k; // Записать в буфер поле адрес источника Src_Addr d = pConfig->myAddr; k = (u8)(d); // Младший значащий байт Src_Addr txMpdu[i++] = k; k = (u8)(d >> 8); // Старший значащий байт Src_Addr txMpdu[i++] = k; return i;}//end basicRfBuildMpdu// НЕрабочий вариант программы/************************************************************************************ @fn basicRfBuildHeader// Построение заголовка пакета в соответствии с IEEE 802.15.4* @brief Builds packet header according to IEEE 802.15.4 frame format* @param buffer - Pointer to buffer to write the header* destAddr - destination short address* payloadLength - length of higher layer payload* @return uint8 - length of header*/uint8 basicRfBuildHeader(uint8* buffer, uint16 destAddr, uint8 payloadLength){ basicRfPktHdr_t *pHdr; pHdr= (basicRfPktHdr_t*)buffer; // Populate packet header pHdr->packetLength = payloadLength + BASIC_RF_PACKET_OVERHEAD_SIZE; pHdr->frameControlField = pConfig->ackRequest ? BASIC_RF_FCF_ACK : BASIC_RF_FCF_NOACK; pHdr->seqNumber= txState.txSeqNumber; pHdr->panId= pConfig->panId; pHdr->destAddr= destAddr; pHdr->srcAddr= pConfig->myAddr; return sizeof(basicRfPktHdr_t);}//end basicRfBuildMpdu// Basic RF packet header (IEEE 802.15.4)typedef struct { uint8 packetLength; uint16 frameControlField; uint8 seqNumber; uint16 panId; uint16 destAddr; uint16 srcAddr;} basicRfPktHdr_t;Неработоспособность выражается в том, что структура pHdr неверноотображается на массив buffer, вместо байт вставляются слова (2 байта)