stm32+ucosII+usart串口的接收,重在分析过程

*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/
#include <includes.h>
#include  <m2sxxx.h>
#include  <mss_gpio.h>
#include <mss_uart.h>
#include <mss_pdma.h>
#include <cpu.h>
/*
*********************************************************************************************************
*                                              任务优先级定义
*********************************************************************************************************
*/
#define TaskStack 100                                                 //各个任务的堆栈大小

#define  APP_CFG_TASK_LEDon_PRIO                   3                  //灯亮任务的优先级
#define  APP_CFG_TASK_OrderDo_PRIO                 5                  //执行计算机发来命令的任务
#define  APP_CFG_TASK_Datameasure_PRIO             7                  //对采样数据进行量化统计特征值任务
#define  APP_CFG_TASK_Datatransfer_PRIO             9                 //将打包数据上传计算机任务

#define SRAM1_ADDR 0x30000000                                         //sin数据地址
#define SRAM2_ADDR 0x3FFF0000                                        // 步长地址
#define SRAM3_ADDR 0x50000000                                       //高斯噪声采样数据ram1
#define SRAM4_ADDR 0x50000400                                      //高斯噪声采样数据ram2
/*
*********************************************************************************************************
*                                         任务堆栈
*********************************************************************************************************
*/
static  OS_STK          AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE];
static  OS_STK          AppTaskLEDonStk[TaskStack];
static  OS_STK          APPTaskOrderDoStk[TaskStack];
static  OS_STK          APPTaskDatameasureStk[TaskStack];
/*
*********************************************************************************************************
*                                         函数声明
*********************************************************************************************************
*/
void  App_TaskStart   (void  *p_arg);
void  App_TaskLEDon  (void  *p_arg);
void  APPTaskOrderDo  (void  *p_arg);
void  APPTaskDatameasure  (void  *p_arg);

int            number(uint8_t data);
int            package(float data, uint8_t addressH);
void           bsp_GPIO0_IRQHandler(void);
void           bsp_GPIO3_IRQHandler(void);
void           bsp_uart0_rx_handler( mss_uart_instance_t * this_uart );
void           bsp_APPTaskDatatransfer_handler (void);
/*
*********************************************************************************************************
*                                        信号量
*********************************************************************************************************
*/

OS_EVENT *Datafull;
OS_EVENT *DataTranRdy;
OS_EVENT *OrderDo;
/*
*********************************************************************************************************
*                                        全局变量
*********************************************************************************************************
*/
uint32_t *sram_addr1=(uint32_t *)SRAM1_ADDR;
uint32_t *sram_addr2=(uint32_t *)SRAM2_ADDR;
uint32_t *sram_addr3=(uint32_t *)SRAM3_ADDR;
uint32_t *sram_addr4=(uint32_t *)SRAM4_ADDR;

uint32_t staticdata1[256];
uint32_t staticdata2[256];                                     //统计表
uint16_t lianghua[256];
uint32_t *staticdata;                                          //确定用于统计的统计表首地址
uint32_t *bagpoint;                                            //确定用于量化的统计表首地址
uint8_t bag[100][258];
uint16_t bag_lengthe=0;
uint8_t image_0ne[5][4]={{' ',' ',' ',' '},{' ',' ',' ','|'},{' ',' ',' ',' '},{' ',' ',' ','|'},{' ',' ',' ',' '}};
     uint8_t image_two[5][4]={{' ','-','-',' '},{' ',' ',' ','|'},{' ','-','-',' '},{'|',' ',' ',' '},{' ','-','-',' '}};
     uint8_t image_three[5][4]={{' ','-','-',' '},{' ',' ',' ','|'},{' ','-','-',' '},{' ',' ',' ','|'},{' ','-','-',' '}};
     uint8_t image_four[5][4]={{' ',' ',' ',' '},{'|',' ',' ','|'},{' ','-','-',' '},{' ',' ',' ','|'},{' ',' ',' ',' '}};
     uint8_t image_five[5][4]={{' ','-','-',' '},{'|',' ',' ',' '},{' ','-','-',' '},{' ',' ',' ','|'},{' ','-','-',' '}};
     uint8_t image_six[5][4]={{' ','-','-',' '},{'|',' ',' ',' '},{' ','-','-',' '},{'|',' ',' ','|'},{' ','-','-',' '}};
     uint8_t image_severn[5][4]={{' ','-','-',' '},{' ',' ',' ','|'},{' ',' ',' ',' '},{' ',' ',' ','|'},{' ',' ',' ',' '}};
     uint8_t image_eight[5][4]={{' ','-','-',' '},{'|',' ',' ','|'},{' ','-','-',' '},{'|',' ',' ','|'},{' ','-','-',' '}};
     uint8_t image_night[5][4]={{' ','-','-',' '},{'|',' ',' ','|'},{' ','-','-',' '},{' ',' ',' ','|'},{' ','-','-',' '}};
     uint8_t image_A[5][4]={{' ','-','-',' '},{'|',' ',' ','|'},{' ','-','-',' '},{'|',' ',' ','|'},{' ',' ',' ',' '}};
     uint8_t image_zero[5][4]={{' ','-','-',' '},{'|',' ',' ','|'},{' ',' ',' ',' '},{'|',' ',' ','|'},{' ','-','-',' '}};
     uint8_t image_equal[5][4]={{' ',' ',' ',' '},{' ',' ',' ',' '},{' ','-','-',' '},{' ',' ',' ',' '},{' ','-','-',' '}};
     uint8_t image_bai[5][4]={{' ',' ',' ',' '},{' ','0',' ','/'},{' ',' ','/',' '},{' ','/',' ','0'},{' ',' ',' ',' '}};
     uint8_t image_seg[5][4]={{' ','-','-','-'},{'/',' ',' ',' '},{' ','/','-','|'},{'|',' ',' ','|'},{'-','-','-','|'}};
     uint8_t rx_buff[1];
     uint8_t recieve0[16];
     uint8_t recieve0_headata='$';
     uint8_t recieve0_flag[2];
     uint8_t recieve0_follow=0;
     uint8_t recieve0_lengthe=0;
     uint8_t recieve0_endata[2]={0x0d,0x0a};
     uint16_t datacomplete_flag=0;
    float oneS,twoS,threeS;
    uint8_t *q;
    uint32_t cos21[1024]={  0x000,0x002,0x003,0x005,0x006,0x008,0x009,0x00B,0x00D,0x00E,0x010,0x011,0x013,0x014,0x016,0x018,0x019,0x01B,0x01C };
/*
*********************************************************************************************************
*                                                apply()
*
* Description : This is the standard entry point for C code.  It is assumed that your code will call
*               main() once you have performed all necessary initialization.
*
* Argument(s) : none
*
* Return(s)   : none
*
* Caller(s)   : Startup Code.
*
* Note(s)     : none.
*********************************************************************************************************
*/

    int number(uint8_t data)
    {
        switch(data)
        {
          case 0:q=&image_zero[0][0];break;
          case 1:q=&image_0ne[0][0];break;
          case 2:q=&image_two[0][0];break;
          case 3:q=&image_three[0][0];break;
          case 4:q=&image_four[0][0];break;
          case 5:q=&image_five[0][0];break;
          case 6:q=&image_six[0][0];break;
          case 7:q=&image_severn[0][0];break;
          case 8:q=&image_eight[0][0];break;
          case 9:q=&image_night[0][0];break;
        }
        return 0;
    }
    int package(float data, uint8_t addressH)    //打包数组中一个数据,按照格式
    {
         uint8_t a[10];
         uint8_t i,m,n;
         uint16_t data_change;

         data_change=( uint16_t)(data*1000);
           i=0;
           if(data_change==0)
               a[0]=0;
           else{
           while(data_change){
           a[i]=data_change%10;
           data_change=data_change/10;
           i++;
           }
           }
           if(i==0){
               number(a[0]);
             for(m=0;m<5;m++)
                      for(n=0;n<4;n++)
                          bag[addressH+m][190+n]=*(q++);     //one
           }
           if(i==1)
              {
               number(0);
               for(m=0;m<5;m++)
                  for(n=0;n<4;n++)
                     bag[addressH+m][190+n]=*(q++);     //one
               bag[addressH+4][194]='*';              //*
               number(a[0]);
                     for(m=0;m<5;m++)
                        for(n=0;n<4;n++)
                             bag[addressH+m][195+n]=*(q++);     //某个值
                     for(m=0;m<5;m++)
                        for(n=0;n<4;n++)
                            bag[addressH+m][199+n]=image_bai[m][n];     //%
              }
           else{
                   number(a[2]);
                  for(m=0;m<5;m++)
                     for(n=0;n<4;n++)
                        bag[addressH+m][185+n]=*(q++);     //某个值
                  number(a[1]);
                  for(m=0;m<5;m++)
                      for(n=0;n<4;n++)
                        bag[addressH+m][190+n]=*(q++);     //某个值

                  bag[addressH+4][194]='*';              //*
                  number(a[0]);
                   for(m=0;m<5;m++)
                     for(n=0;n<4;n++)
                        bag[addressH+m][195+n]=*(q++);     //某个值
                   for(m=0;m<5;m++)
                     for(n=0;n<4;n++)
                        bag[addressH+m][199+n]=image_bai[m][n];     //%
             }

      return 0;
    }
void GPIO0_IRQHandler(void)
     {
        uint16_t i;
        uint32_t *sram_addr;
        uint32_t temp;
         CPU_SR_ALLOC();
         CPU_CRITICAL_ENTER();                                       /* Tell the OS that we are starting an ISR              */
         OSIntEnter();
         CPU_CRITICAL_EXIT();
        MSS_GPIO_clear_irq(MSS_GPIO_0);
        sram_addr=sram_addr3;
        for(i=0;i<1024;i++)
        {
            temp=*(sram_addr + i);
            staticdata[temp]++;
        }
        datacomplete_flag++;
        if(datacomplete_flag==1024)   //数据是否达到1024*1024
        {
            datacomplete_flag=0;
            OSSemPost(Datafull);
        }
        OSIntExit();                                                /* Tell the OS that we are leaving the ISR              */
     }
void GPIO3_IRQHandler(void)
     {
        uint16_t i;
        uint32_t *sram_addr;
        uint32_t temp;
         CPU_SR_ALLOC();
          CPU_CRITICAL_ENTER();                                       /* Tell the OS that we are starting an ISR              */
          OSIntEnter();
         CPU_CRITICAL_EXIT();
         sram_addr=sram_addr4;

            for(i=0;i<1024;i++)
            {
                temp=*(sram_addr + i);
                staticdata[temp]++;
            }
                datacomplete_flag++;
        MSS_GPIO_clear_irq(MSS_GPIO_3);
        if(datacomplete_flag==1024)   //数据是否达到1024*1024
            {
                datacomplete_flag=0;
                OSSemPost(Datafull);
            }
        OSIntExit();                                                /* Tell the OS that we are leaving the ISR              */
     }

void bsp_uart0_rx_handler( mss_uart_instance_t * this_uart )
    {
     MSS_UART_get_rx( this_uart, &rx_buff[0],1);
     if(rx_buff[0]==recieve0_headata)
          {
            recieve0_flag[0]=1;
            recieve0_lengthe=0;
            recieve0_follow=0;
          }
      if(recieve0_flag[0]==1)
          {
            recieve0[recieve0_follow++]=rx_buff[0];
             if(rx_buff[0]==recieve0_endata[0])
               recieve0_flag[1]=1;
             if(recieve0_flag[1]==1&&rx_buff[0]==recieve0_endata[1])
            {
              recieve0_flag[0]=0;
              recieve0_lengthe=recieve0_follow;
              recieve0_follow=0;
              OSSemPost(OrderDo);
            }
          }
    }
    void  bsp_APPTaskDatatransfer_handler (void)
    {
        PDMA_clear_irq(PDMA_CHANNEL_0);
        OSSemPost(DataTranRdy);
    }
    /*
    *********************************************************************************************************
    *                                                main()
    *
    * Description : This is the standard entry point for C code.  It is assumed that your code will call
    *               main() once you have performed all necessary initialization.
    *
    * Argument(s) : none
    *
    * Return(s)   : none
    *
    * Caller(s)   : Startup Code.
    *
    * Note(s)     : none.
    *********************************************************************************************************
    */
int  main (void)
{
    CPU_Init();                                                 /* Initialize the uC/CPU services                           */

    CPU_IntDis();

    OSInit();                                                   /* Initialize "uC/OS-II, The Real-Time Kernel"              */

    OSTaskCreate(App_TaskStart,                              /* Create the start task                                    */
                 (void *)0,
                 (OS_STK *)&AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE - 1],
                 APP_CFG_TASK_START_PRIO
                 );
    OSStart();

    return (0);
}


/*
*********************************************************************************************************
*                                          STARTUP TASK
*
* Description : This is an example of a startup task.  As mentioned in the book's text, you MUST
*               initialize the ticker only once multitasking has started.
*
* Arguments   : p_arg   is the argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
*
* Returns     : none
*
* Notes       : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
*                  used.  The compiler should not generate any code for this statement.
*********************************************************************************************************
*/
void  App_TaskStart (void *p_arg)
{
    CPU_INT32U  cnt;
    CPU_INT32U  systick_clk;
    uint16_t m;

    (void)p_arg;
    systick_clk = BSP_CPU_ClkFreqGet();                         /* Get the System Tick Timer frequency                  */
    cnt         = (systick_clk / OS_TICKS_PER_SEC);             /* Calculate the number of SysTick counts               */
    OS_CPU_SysTickInit(cnt);                                    /* Call the Generic OS Systick initialization           */
    Mem_Init();                                                 /* Initialize memory management module                  */
    Math_Init();                                                 /* Initialize mathematical module                       */
    Datafull=OSSemCreate(0);
    OrderDo=OSSemCreate(0);
    staticdata=staticdata1;
    PDMA_init();
    for(m=0;m<256;m++)
    {
        staticdata1[m]=0;
        staticdata2[m]=0;
    }
    MSS_GPIO_init();
       MSS_GPIO_config( MSS_GPIO_1 , MSS_GPIO_OUTPUT_MODE );  //测试GPIO中断中运行时间
       MSS_GPIO_config( MSS_GPIO_4 , MSS_GPIO_OUTPUT_MODE );  //测试GPIO中断中运行时间
       MSS_GPIO_config( MSS_GPIO_5 , MSS_GPIO_OUTPUT_MODE );
       MSS_GPIO_config( MSS_GPIO_6 , MSS_GPIO_OUTPUT_MODE );
       MSS_GPIO_config( MSS_GPIO_7 , MSS_GPIO_OUTPUT_MODE );
       for(m = 0; m< 1024; m++)
       {
                *(sram_addr1 + m) =cos21[m];
       }
       MSS_GPIO_set_output( MSS_GPIO_4, 0);    //写完后拉低
    MSS_GPIO_config(MSS_GPIO_0 , MSS_GPIO_INPUT_MODE | MSS_GPIO_IRQ_EDGE_NEGATIVE); //GPIO_0 下降沿触发
    MSS_GPIO_config(MSS_GPIO_3 , MSS_GPIO_INPUT_MODE | MSS_GPIO_IRQ_EDGE_NEGATIVE); //GPIO_0 下降沿触发

    MSS_UART_init(&g_mss_uart0,
                          MSS_UART_115200_BAUD,
                          MSS_UART_DATA_8_BITS | MSS_UART_NO_PARITY
                                               | MSS_UART_ONE_STOP_BIT);                           //串口初始化
    MSS_UART_set_rx_handler( &g_mss_uart0, bsp_uart0_rx_handler,MSS_UART_FIFO_SINGLE_BYTE );
    PDMA_configure(PDMA_CHANNEL_0,
                           PDMA_TO_UART_0,
                           PDMA_BYTE_TRANSFER | PDMA_LOW_PRIORITY
                                              | PDMA_INC_SRC_ONE_BYTE
                                              | PDMA_NO_INC,0);
       PDMA_set_irq_handler(PDMA_CHANNEL_0,bsp_APPTaskDatatransfer_handler);

    OSTaskCreate(App_TaskLEDon,(void *)0,(OS_STK *)&AppTaskLEDonStk[APP_CFG_TASK_START_STK_SIZE - 1],APP_CFG_TASK_LEDon_PRIO);
    OSTaskCreate(APPTaskOrderDo,(void *)0,(OS_STK *)&APPTaskOrderDoStk[TaskStack-1],APP_CFG_TASK_OrderDo_PRIO);
    OSTaskCreate(APPTaskDatameasure,(void *)0,(OS_STK *)&APPTaskDatameasureStk[TaskStack-1],APP_CFG_TASK_Datameasure_PRIO);

    PDMA_enable_irq(PDMA_CHANNEL_0);
    MSS_GPIO_enable_irq(MSS_GPIO_0);
    MSS_GPIO_enable_irq(MSS_GPIO_3);
    MSS_GPIO_set_output( MSS_GPIO_1, 0);
    while (DEF_TRUE) {                                          /* Look for button presses                              */
        OSTimeDlyHMSM(0,0,2,0);
        MSS_GPIO_set_output( MSS_GPIO_1, 0);
    }
}

/*
*********************************************************************************************************
*                                          AppTaskCreate()
*
* Description : Create application tasks.
*
* Argument(s) : none
*
* Return(s)   : none
*
* Caller(s)   : AppTaskStart()
*
* Note(s)     : none.
*********************************************************************************************************
*/




void  App_TaskLEDon  (void  *p_arg)
{
    while(1){
    MSS_GPIO_set_output( MSS_GPIO_1, 1);
    OSTimeDlyHMSM(0,0,3,0);
    }
}
 void APPTaskDatameasure  (void  *p_arg)
{
    uint8_t err,n;
    uint16_t m;
    uint32_t total_number=1048576;
    float avg;
    float S;
    float oneS_flag1,twoS_flag1,threeS_flag1;
    float oneS_flag2,twoS_flag2,threeS_flag2;
    uint32_t maxstaticdata=0;
    CPU_SR_ALLOC();
    DataTranRdy=OSSemCreate(1);
    while(1)
    {
        OSSemPend(Datafull,0,&err);

        CPU_CRITICAL_ENTER();
        if(staticdata==staticdata1)
        {
            staticdata=staticdata2;
            bagpoint=staticdata1;
        }
         else
         {
             staticdata=staticdata1;
             bagpoint=staticdata2;
         }                                 // 切换a,b表
        CPU_CRITICAL_EXIT();

        avg=0;
        S=0;
        oneS=0;
        twoS=0;
        threeS=0;
        for(m=0;m<128;m++)
        {
            avg=avg+m*bagpoint[m];
        }
         for(m=128;m<256;m++)
         {
             avg=avg-(256-m)*bagpoint[m];
         }
        avg=avg/total_number;                            //求平均值
         for(m=0;m<128;m++)
         {
             S=S+(m-avg)*(m-avg)*bagpoint[m];
         }
         for(m=128;m<256;m++)
         {
             S=S+(m-256-avg)*(m-256-avg)*bagpoint[m];
         }
         S=sqrt(S/(total_number-1));                      //求标准差
         oneS_flag1=avg+S;
         oneS_flag2=avg-S;
         twoS_flag1=avg+2*S;
         twoS_flag2=avg-2*S;
         threeS_flag1=avg+3*S;
         threeS_flag2=avg-3*S;
         for(m=0;m<128;m++)
         {
             if(m<oneS_flag1)
                oneS=oneS+bagpoint[m];
             if(m<twoS_flag1)
                 twoS=twoS+bagpoint[m];
             if(m<threeS_flag1)
                 threeS=threeS+bagpoint[m];
          }
          for(m=128;m<256;m++)
          {
             if(oneS_flag2<(m-256))
                oneS=oneS+bagpoint[m];
             if(twoS_flag2<(m-256))
                 twoS=twoS+bagpoint[m];
             if(threeS_flag2<(m-256))
                 threeS=threeS+bagpoint[m];
          }
         oneS=oneS/total_number;
         twoS=twoS/total_number;
         threeS=threeS/total_number;                    //  统计结束
         if(threeS==1)
          threeS=0.9999;
         maxstaticdata=0;
        for(m=0;m<256;m++)
        {
            if(bagpoint[m]>maxstaticdata)
            maxstaticdata=bagpoint[m];
        }                               //求解最大值
        n=0;
        for(m=128;m<256;m++)
        {
            lianghua[n++]=bagpoint[m]*99/maxstaticdata;
        }
        for(m=0;m<128;m++)
        {
            lianghua[n++]=bagpoint[m]*99/maxstaticdata;
        }                                                             //量化
        for(m=0;m<256;m++)
                 {
                     bagpoint[m]=0;
                 }                                 //表清零待备用

        OSSemPend(DataTranRdy,0,&err);

        for(m=0;m<256;m++)
             for(n=0;n<100;n++)
             {
               if(n==lianghua[m])
               bag[99-n][m]='*';
                  if(n<lianghua[m])
               bag[99-n][m]='|';
               if(n>lianghua[m])
               bag[99-n][m]=' ';              //数据打包

              }
            for(n=0;n<100;n++)
                 bag[n][256]=0x0d;             //数据打包
            for(n=0;n<100;n++)
                 bag[n][257]=0x0a;           //数据打包
            package(oneS,6);
            package(twoS,12);
            package(threeS,18);
            PDMA_start(PDMA_CHANNEL_0,
                          (uint32_t)bag,
                          PDMA_UART0_TX_REGISTER,
                          25800);

    }
}
void  APPTaskOrderDo  (void  *p_arg)
{
    uint8_t err;
    uint16_t m;
    uint32_t i;
    uint32_t buchang=0;
    CPU_SR_ALLOC();
    while(1)
    {
        OSSemPend(OrderDo,0,&err);
        if(recieve0_lengthe>3)
              {
                  if(recieve0_lengthe==4&&(recieve0[recieve0_lengthe-3]>57||recieve0[recieve0_lengthe-3]<48))
                      switch(recieve0[1]){
                      case 'A':
                     {
                       CPU_CRITICAL_ENTER();
                       MSS_GPIO_set_output( MSS_GPIO_5, 0);
                       MSS_GPIO_set_output( MSS_GPIO_6, 1);
                       datacomplete_flag=0;
                       staticdata=staticdata1;
                       bagpoint=staticdata1;
                       for(m=0;m<256;m++)
                         {
                           staticdata1[m]=0;
                           staticdata2[m]=0;
                         }                                 //表清零待备用
                       CPU_CRITICAL_EXIT();
                       break;
                      }
                      case'B':
                      {
                        CPU_CRITICAL_ENTER();
                        MSS_GPIO_set_output( MSS_GPIO_5, 1);
                        MSS_GPIO_set_output( MSS_GPIO_6, 0);
                        datacomplete_flag=0;
                        staticdata=staticdata1;
                         bagpoint=staticdata1;
                        for(m=0;m<256;m++)
                          {
                            staticdata1[m]=0;
                           staticdata2[m]=0;
                          }                                 //表清零待备用
                        CPU_CRITICAL_EXIT();
                        break;
                      }
                      case'C':
                       {
                         CPU_CRITICAL_ENTER();
                         MSS_GPIO_set_output( MSS_GPIO_5, 1);
                         MSS_GPIO_set_output( MSS_GPIO_6, 1);
                         datacomplete_flag=0;
                         datacomplete_flag=0;
                         staticdata=staticdata1;
                         bagpoint=staticdata1;
                         for(m=0;m<256;m++)
                         {
                           staticdata1[m]=0;
                            staticdata2[m]=0;
                         }                                 //表清零待备用
                         CPU_CRITICAL_EXIT();
                         break;
                       }
                      case'D':
                      {
                         CPU_CRITICAL_ENTER();
                         datacomplete_flag=0;
                         staticdata=staticdata1;
                        bagpoint=staticdata1;
                         for(m=0;m<256;m++)
                            {
                              staticdata1[m]=0;
                              staticdata2[m]=0;
                             }                                 //表清零待备用
                        MSS_GPIO_set_output( MSS_GPIO_7, 0);         //慢速
                       CPU_CRITICAL_EXIT();
                       break;
                      }
                      case'E':
                      {
                        CPU_CRITICAL_ENTER();
                        MSS_GPIO_set_output( MSS_GPIO_7, 1);        //快速
                        CPU_CRITICAL_EXIT();
                        break;
                      }
                  }

                      else
                      {
                        while(recieve0_lengthe-3)
                        {
                          if(recieve0[recieve0_lengthe-3]>57||recieve0[recieve0_lengthe-3]<48)
                              break;
                          buchang= buchang+(recieve0[recieve0_lengthe-3]-48)*i;
                          i=i*10;
                          recieve0_lengthe--;
                        }
                       *sram_addr2=buchang;
                      }
        }
   }
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值