\qquad 下面是HD-GR GNSS导航软件的电文处理任务实现代码:
// main_message.c -- Navigation message processing task.
/*
* Copyright (C) 2005 Andrew Greenberg
* Distributed under the GNU GENERAL PUBLIC LICENSE (GPL) Version 2 (June 1991).
* See the "COPYING" file distributed with this software for more information.
*/
/* Namuru GPS receiver project
* Original : message.c
* Mods : driving LED part has commented/replaced for Namuru HW
* version : V1.1
* date : 8/7/2008
*/
/*
* HD-GR GNSS receiver project
* Modes : Inherited the code of message.c in the Namuru GPS receiver project
* V1.0 and made necessary adjustments to adapt to the new RTOS and
* functions.
* version : V1.0
* date : xx/xx/2015
*/
#include <io.h>
#include <stdio.h>
#include <math.h>
#include "includes.h"
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
#include "gps_message.h"
#include "b1i_message.h"
#include "main_ephemeris.h"
#include "main_position.h"
/******************************************************************************
* Defines
******************************************************************************/
/******************************************************************************
* Globals
******************************************************************************/
OS_FLAG_GRP *m_MessageFlag __attribute__ ((section(".isrdata.rwdata")));
OS_FLAGS channels_with_subframes __attribute__ ((section(".isrdata.rwdata")));
/******************************************************************************
* Statics
******************************************************************************/
/******************************************************************************
* Stuff incoming bits from the accum_task into words and subframes in
* the messages structure.
******************************************************************************/
void message_task(void* pdata) // input 'pdata' not used
{
INT8U err;
OS_FLAGS channels_with_bits, channel_bits;
// There's no way that we're going to get a bit before this thread
// is first executed, so it's ok to run the flag init here.
m_MessageFlag = OSFlagCreate((OS_FLAGS)0, &err);
while (1) {
// Block if there are no channels with bits ready. Wake up if any bits
// from the 20 channels (0xFFFFF) are set. Clear the flag on wakeup,
// with the bits saved in channels_with_bits.
channels_with_bits = OSFlagPend(m_MessageFlag,
(1 << TOT_MAX_CHANNELS) - 1,
OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME,
0, &err);
// OK we're awake, process the messages
GNSS_ENTER_CRITICAL();
channel_bits = g_channel_bits;
GNSS_EXIT_CRITICAL();
// led_turnon(LED3);
// Clear the flag IPC shadow (see below)
channels_with_subframes = 0;
if (m_sys_posconst & POS_CONSTELL_BDS) {
b1i_process_message(channels_with_bits >> GPS_MAX_CHANNELS,
channel_bits >> GPS_MAX_CHANNELS);
channels_with_subframes <<= GPS_MAX_CHANNELS;
}
if (m_sys_posconst & POS_CONSTELL_GPS) {
gps_process_message(channels_with_bits, channel_bits);
}
// Wake up the ephemeris thread if there are subframes ready
if (channels_with_subframes) {
OSFlagPost(m_EphemerisChannelFlag, channels_with_subframes, OS_FLAG_SET, &err);
}
// led_turnoff(LED3);
}
}