This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3220S-LAUNCHXL:读取 RTC 时间

Guru**** 2575815 points
Other Parts Discussed in Thread: CC3220SF, CC3220S, CC3220MOD

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/595181/cc3220s-launchxl-reading-rtc-time

器件型号:CC3220S-LAUNCHXL
主题中讨论的其他器件:CC3220SFCC3220SCC3220MOD

我实现了一个1秒的计时器来读取 RTC 的日期和时间。  我不理解的是、为什么时间永远不会增加。  我在这里不理解什么?

void timerCallback (Timer_handle myHandle)
{
UART_PRINT ("定时器中断\r\n");
slDateTime_t DateTime ={0};
uint8_t configLen = sizeof (slDateTim_t);
uint8_t configOpt = sl_device_General_date_time;
sl_DeviceGet (sl_device_General、&configOpt、&configLen、(uint8_t *)(&DateTime));
UART_PRINT ("日期%d、星期一%d、年%d、小时%d、最小%d、安全%d\r\n"、DateTime.tm_day、DateTime.tm_mon、DateTime.tm_year、DateTime.tm_hour、DateTimeTM_min、DateTimeTM_min、DateTimeTM_sec);
} 

定时器中断
Day 12、Mon 5、Year 2017、Hour 12、Min 6、Sec 0
定时器中断
Day 12、Mon 5、Year 2017、Hour 12、Min 6、Sec 0
定时器中断
Day 12、Mon 5、Year 2017、Hour 12、Min 6、Sec 0
定时器中断
Day 12、Mon 5、Year 2017、Hour 12、Min 6、Sec 0
定时器中断
Day 12、Mon 5、Year 2017、Hour 12、Min 6、Sec 0
定时器中断
Day 12、Mon 5、Year 2017、Hour 12、Min 6、Sec 0
定时器中断
Day 12、Mon 5、Year 2017、Hour 12、Min 6、Sec 0
定时器中断
Day 12、Mon 5、Year 2017、Hour 12、Min 6、Sec 0
定时器中断
Day 12、Mon 5、Year 2017、Hour 12、Min 6、Sec 0
定时器中断
Day 12、Mon 5、Year 2017、Hour 12、Min 6、Sec 0
定时器中断
Day 12、Mon 5、Year 2017、Hour 12、Min 6、Sec 0
定时器中断

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、这会触发 HWI 异常、以至于我似乎无法跟踪。 如果我注释掉 sl_DeviceGet、则不再发生异常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Andrew、

    要检查的几件事:-

    -您是否从 SL_* API 调用中返回了任何错误?

    -这是从哪个线程上下文调用的、请检查该代码是否未从中断上下文调用、因为不应从中断或 simplelink 回调处理程序调用 simplelink API。

    -从任务调用时,如果在两者之间使用 sleep(),同样的代码是否起作用?

    ~Roger

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    void * mainThread( void *arg )
    {
    int32_t RetVal;
    pthread_attr_t pAttrs;
    pthread_attr_t pAttrs_spawn;
    struct sched_param primParam;
    struct timespec TS ={0};
    
    Board_initGPIO();
    Board_initSPI ();
    Board_initI2C();
    
    // init Terminal、 并打印应用程序名称*/
    InitTerm();
    
    /*初始化实时时钟*/
    clock_settime (clock_realtime,&ts);
    
    InitializeAppVariables();
    
    //关闭板上的所有 LED */
    GPIO_write (Board_LED0,Board_LED_OFF);
    
    //初始化所有任务的信号*/
    SEM_init (&Provisioning_ControlBlock.connectionEvent,SEM_0,
    Provisioning_ControlBlock.provisioningDoneSignal); 0);
    SEM_INIT (&Provisioning_ControlBlock.provisioningConnDoneToOtaServerSignal、0、0);
    SEM_INIT (&LinkLocal_ControlBlock.otaReportServerStartSignal、 0、0);
    SEM_INIT (&LinkLocal_ControlBlock.otaReportServerStopSignal、0、0);
    
    /*创建 sl_Task */
    pthread_attr_init (&pAttrs_spawn);
    priParam.sched_priority = spawn_task_priority;
    RetVal = pthread_attr_setschedparam (&pAttrs_spawn、&Param);
    RetVal |= pthread_attr_setstacks_setpawn (&pAttrawn) Task_stack_size);
    
    RetVal = pthread_create (&gSpawnThread、&pAttrs_spawn、sl_Task、NULL);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 SL_Task 线程\n");
    while (1);
    }
    RetVal = sl_Start (0、0、0);
    如果(RetVal >= 0)
    {
    DisplayBanner (application_name、application_version);
    RetVal = sl_Stop (sl_stop_timeout);
    如果(RetVal < 0)
    {
    /*句柄错误*/
    UART_PRINT ("\n SL_Stop 失败\n");
    while (1);
    }
    }
    如果((RetVal < 0)&&(RetVal!= SL_ERROR_RESTORE_IMAGE_COMPLETE))、则为其他值
    {
    /*句柄错误*/
    UART_PRINT ("\n sl_Start Failed\n");
    UART_PRINT ("\n %s 示例版本。 %s\n",application_name,application_version);
    while (1);
    }
    
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、 Task_stack_size);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置置备任务线程参数\n");
    while (1);
    }
    
    RetVal = pthread_create (&G) ProvisioningThread、&pAttrs、ProvisioningTask、NULL);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建置备任务线程\n");
    while (1);
    }
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、LINKLOCAL_STACK_SIZE);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置 linkLocalTask 线程参数\n");
    while (1);
    }
    
    RetVal = pthread_create (&G) LinklocalThread、&pAttrs、linkLocalTask、NULL);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 linkLocalTask 线程\n");
    while (1);
    }
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、control_stack_size);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置 controlTask 线程参数\n");
    while (1);
    }
    
    RetVal = pthread_create (&gControlThread、&pAttrs、controlTask、NULL);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 controlTask 线程\n");
    while (1);
    }
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 5;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、task_stack_size);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置 otaTask 线程参数\n");
    while (1);
    }
    
    RetVal = pthread_create (&gOtaThread、&pAttrs、otaTask、NULL);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 otaTask 线程\n");
    while (1);
    }
    
    //********* /
    /*以微秒为单位的周期和占空比*/
    Timer_handle timer0;
    Timer_Params 参数;
    
    /*调用驱动程序初始化函数*/
    GPIO_init();
    timer_init();
    
    /*关闭用户 LED */
    GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_OFF);
    
    /*将计时器设置为连续回调模式,以调用回调
    *每1、000、000微秒或1秒运行一次。
    *
    Timer_Params_init (&params);
    params.period = 10000000;
    Params.periodUnits = Timer_Period_US;
    params.timerMode = Timer_Continuous_callback;
    params.timerCallback = timerCallback;
    
    timer0 = Timer_open (Board_TIMER0、params);
    
    if (timer0 == NULL){
    /*初始化计时器失败*/
    while (1);
    }
    
    如果(Timer_start (timer0)= Timer_STATUS_ERROR){
    /*无法启动计时器*/
    while (1);
    ??//********* /
    
    return (0);
    } 

     如果我正在正确解释代码、则会从计时器硬件中断调用它。  下面我做了一个测试,并在调用 DisplayBanner()时打印它,该函数在一些初始化内容期间被调用。

    slDateTime_t DateTime ={0};
    uint8_t configLen = sizeof (slDateTim_t);
    uint8_t configOpt = sl_device_General_date_time;
    sl_DeviceGet (sl_device_General、&configOpt、&configLen、(uint8_t *)(&DateTime));
    UART_PRINT ("日期%d、星期一%d、年%d、小时%d、最小%d、安全%d\n"、DateTime.tm_day、DateTime.tm_mon、DateTime.tm_year、DateTime.tm_hour、DateTimeTM_min、DateTimeTM_min、DateTimeTM_sec);
    UART_PRINT (lineBreak);
    UART_PRINT (lineBreak);
    睡眠(70);
    sl_DeviceGet (sl_device_General、&configOpt、&configLen、(_u8 *)(&DateTime));
    UART_PRINT ("日期%d、星期一%d、年%d、小时%d、最小%d、安全%d\n"、DateTime.tm_day、DateTime.tm_mon、DateTime.tm_year、DateTime.tm_hour、DateTimeTM_min、DateTimeTM_min、DateTimeTM_sec);
    UART_PRINT (lineBreak);
    UART_PRINT (lineBreak); 

    有趣的是 、分钟数确实从6变为8、但秒数似乎从未更新。  不确定原因。  错误?

    您会建议我如何实现这一点?  我几乎每 秒都需要检查一次时间。

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andrew:

    是的、没错。  计时器模块将从 ISR 上下文调用您的回调。

    我认为 configLen 应该是_U16类型。  可以试试吗?

    -从 Timer_回调调用时,这实际上是从中断上下文调用的,因此您应该从计时器发布一个标志,然后从任务上下文调用 sl_* API。

    希望这有所帮助、

    ~Roger

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、您对 configLen 正确、应为 U16

      如果我了解您的评价以及 TI RTOS 的其他文档、我将会执行以下操作:

    void timerCallback (Timer_handle myHandle)
    {
    UART_PRINT ("定时器中断\r\n");
    SEM_post (&timerStartSignal);
    
    }
    
    void * TimerTask (void * pvParameters)
    {
    while (1)
    {
    SEM_WAIT (&timerStartSignal);
    UART_PRINT ("定时器任务\r\n"); 
    // TODO:调用 SL API 以获取当前时间 }

    然后、在主线程内部、我添加了以下内容:

    SEM_INIT (&timerStartSignal、0、0); 
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、task_stack_size);
    
    if (重定位)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置 TimerTask 线程参数\n");
    while (1);
    }
    
    RetVal = pthread_create (&gtimerThread、&pAttrs、TimerTask、NULL);
    
    if (重定位)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 TimerTask 线程\n");
    while (1);
    } 

    但是、它似乎不起作用。  我一直在 Error_PolicyMin 内部结束。  我不确定该函数是什么。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我修复了 Error_PolicyMin 的问题... 似乎是堆栈大小问题。 我至少可以看到我的线程正在运行、但从 TimerTask 调用 sl_DeviceGet 时、获取时间的方法仍然无效。 时间永不更新。 我还注意到 demo.html 页面不再工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Andrew、

    如果可以、请发布代码、以便我们了解一下。

    ~Roger

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    
    


    void * mainThread( void *arg ) { int32_t RetVal; pthread_attr_t pAttrs; pthread_attr_t pAttrs_spawn; struct sched_param primParam; struct timespec TS ={0}; Board_initGPIO(); Board_initSPI (); Board_initI2C(); // init Terminal、 并打印应用程序名称*/ InitTerm(); /*初始化实时时钟*/ clock_settime (clock_realtime,&ts); InitializeAppVariables(); //关闭板上的所有 LED */ GPIO_write (Board_LED0,Board_LED_OFF); //初始化所有任务的信号*/ SEM_init (&Provisioning_ControlBlock.connectionEvent,SEM_0, Provisioning_ControlBlock.provisioningDoneSignal); 0); SEM_INIT (&Provisioning_ControlBlock.provisioningConnDoneToOtaServerSignal、0、0); SEM_INIT (&LinkLocal_ControlBlock.otaReportServerStartSignal、 0、0); SEM_INIT (&LinkLocal_ControlBlock.otaReportServerStopSignal、0、0); SEM_INIT (&timerStartSignal、0、0); //创建 sl_Task */ pthread_attr_init (&pAttrs_spawn); priParam.sched_priority = spawn_task_priority; RetVal = pthread_attr_setschedparam (&pAttrs_spwn、prime_param= pawn ;&pattra_setr&pattraf);param_setrthr&pattraf Task_stack_size); RetVal = pthread_create (&gSpawnThread、&pAttrs_spawn、sl_Task、NULL); if (RetVal) { /*句柄错误*/ UART_PRINT ("无法创建 SL_Task 线程\n"); while (1); } RetVal = sl_Start (0、0、0); 如果(RetVal >= 0) { DisplayBanner (application_name、application_version); RetVal = sl_Stop (sl_stop_timeout); 如果(RetVal < 0) { /*句柄错误*/ UART_PRINT ("\n SL_Stop 失败\n"); while (1); } } 如果((RetVal < 0)&&(RetVal!= SL_ERROR_RESTORE_IMAGE_COMPLETE))、则为其他值 { /*句柄错误*/ UART_PRINT ("\n sl_Start Failed\n"); UART_PRINT ("\n %s 示例版本。 %s\n",application_name,application_version); while (1); } pthread_attr_init (&pAttrs); priParam.sched_priority = 1; RetVal = pthread_attr_setschedparam (&pAttrs、&priParam); RetVal |= pthread_attr_setstacksize (&pAttrs、 Task_stack_size); if (RetVal) { /*句柄错误*/ UART_PRINT ("无法配置置备任务线程参数\n"); while (1); } RetVal = pthread_create (&G) ProvisioningThread、&pAttrs、ProvisioningTask、NULL); if (RetVal) { /*句柄错误*/ UART_PRINT ("无法创建置备任务线程\n"); while (1); } pthread_attr_init (&pAttrs); priParam.sched_priority = 1; RetVal = pthread_attr_setschedparam (&pAttrs、&priParam); RetVal |= pthread_attr_setstacksize (&pAttrs、LINKLOCAL_STACK_SIZE); if (RetVal) { /*句柄错误*/ UART_PRINT ("无法配置 linkLocalTask 线程参数\n"); while (1); } RetVal = pthread_create (&G) LinklocalThread、&pAttrs、linkLocalTask、NULL); if (RetVal) { /*句柄错误*/ UART_PRINT ("无法创建 linkLocalTask 线程\n"); while (1); } pthread_attr_init (&pAttrs); priParam.sched_priority = 1; RetVal = pthread_attr_setschedparam (&pAttrs、&priParam); RetVal |= pthread_attr_setstacksize (&pAttrs、control_stack_size); if (RetVal) { /*句柄错误*/ UART_PRINT ("无法配置 controlTask 线程参数\n"); while (1); } RetVal = pthread_create (&gControlThread、&pAttrs、controlTask、NULL); if (RetVal) { /*句柄错误*/ UART_PRINT ("无法创建 controlTask 线程\n"); while (1); } pthread_attr_init (&pAttrs); priParam.sched_priority = 5; RetVal = pthread_attr_setschedparam (&pAttrs、&priParam); RetVal |= pthread_attr_setstacksize (&pAttrs、task_stack_size); if (RetVal) { /*句柄错误*/ UART_PRINT ("无法配置 otaTask 线程参数\n"); while (1); } RetVal = pthread_create (&gOtaThread、&pAttrs、otaTask、NULL); if (RetVal) { /*句柄错误*/ UART_PRINT ("无法创建 otaTask 线程\n"); while (1); } //******** AP'********* / pthread_attr_init (&pAttrs); priParam.sched_priority = 1; RetVal = pthread_attr_setschedparam (&pAttrs、&priParam); RetVal |= pthread_attr_setstacksize (&pAttrs、timer_stack_size); if (重定位) { /*句柄错误*/ UART_PRINT ("无法配置 TimerTask 线程参数\n"); while (1); } RetVal = pthread_create (&gtimerThread、&pAttrs、TimerTask、NULL); if (重定位) { /*句柄错误*/ UART_PRINT ("无法创建 TimerTask 线程\n"); while (1); } //********* / //********* / /*以微秒为单位的周期和占空比*/ Timer_handle timer0; Timer_Params 参数; /*调用驱动程序初始化函数*/ timer_init(); /*关闭用户 LED */ GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_OFF); /*将计时器设置为连续回调模式,以调用回调 *每1、000、000微秒或1秒运行一次。 * Timer_Params_init (&params); params.period = 10000000; Params.periodUnits = Timer_Period_US; params.timerMode = Timer_Continuous_callback; params.timerCallback = timerCallback; timer0 = Timer_open (Board_TIMER0、params); if (timer0 == NULL){ /*初始化计时器失败*/ while (1); } 如果(Timer_start (timer0)= Timer_STATUS_ERROR){ /*无法启动计时器*/ while (1); ??//********* / return (0); }

    void timerCallback (Timer_handle myHandle)
    {
    UART_PRINT ("定时器中断\r\n");
    SEM_post (&timerStartSignal);
    slDateTime_t DateTime ={0};
    uint8_t configLen = sizeof (slDateTim_t);
    uint8_t configOpt = sl_device_General_date_time;
    sl_DeviceGet (sl_device_General、&configOpt、&configLen、(uint8_t *)(&DateTime));
    UART_PRINT ("日期%d、星期一%d、年%d、小时%d、最小%d、安全%d\r\n"、DateTime.tm_day、DateTime.tm_mon、DateTime.tm_year、DateTime.tm_hour、DateTimeTM_min、DateTimeTM_sec);
    }
    
    * TimerTask (void *pv1参数
    
    )
    {void (while)}
    SEM_WAIT (&timerStartSignal);
    UART_PRINT ("定时器任务\r\n");
    
    }
    
    

    时间现在正在更新、但一旦一个站连接并进入 Demo.html、它就会崩溃。然后程序结束为 void Hwi_explHandler (UINT * exstack、UINT LR)

    当前堆栈大小为:

    #define task_stack_size (2048)

    #define LINKLOCAL_STACK_SIZE (3072)

    #define CONTRAL_STACK_SIZE (2048)

    #define TIMER_STACK_SIZE (1024)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    忽略我之前的帖子。  我的代码版本错误、在 timercallback 中包含 sl_DeviceGet。  

    void * mainThread( void *arg )
    {
    int32_t RetVal;
    pthread_attr_t pAttrs;
    pthread_attr_t pAttrs_spawn;
    struct sched_param primParam;
    struct timespec TS ={0};
    
    Board_initGPIO();
    Board_initSPI ();
    Board_initI2C();
    
    // init Terminal、 并打印应用程序名称*/
    InitTerm();
    
    /*初始化实时时钟*/
    clock_settime (clock_realtime,&ts);
    
    InitializeAppVariables();
    
    //关闭板上的所有 LED */
    GPIO_write (Board_LED0,Board_LED_OFF);
    
    //初始化所有任务的信号*/
    SEM_init (&Provisioning_ControlBlock.connectionEvent,SEM_0,
    Provisioning_ControlBlock.provisioningDoneSignal); 0);
    SEM_INIT (&Provisioning_ControlBlock.provisioningConnDoneToOtaServerSignal、0、0);
    SEM_INIT (&LinkLocal_ControlBlock.otaReportServerStartSignal、 0、0);
    SEM_INIT (&LinkLocal_ControlBlock.otaReportServerStopSignal、0、0);
    SEM_INIT (&timerStartSignal、0、0);
    
    //创建 sl_Task */
    pthread_attr_init (&pAttrs_spawn);
    priParam.sched_priority = spawn_task_priority;
    RetVal = pthread_attr_setschedparam (&pAttrs_spwn、prime_param= pawn
    ;&pattra_setr&pattraf);param_setrthr&pattraf Task_stack_size);
    
    RetVal = pthread_create (&gSpawnThread、&pAttrs_spawn、sl_Task、NULL);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 SL_Task 线程\n");
    while (1);
    }
    RetVal = sl_Start (0、0、0);
    如果(RetVal >= 0)
    {
    DisplayBanner (application_name、application_version);
    RetVal = sl_Stop (sl_stop_timeout);
    如果(RetVal < 0)
    {
    /*句柄错误*/
    UART_PRINT ("\n SL_Stop 失败\n");
    while (1);
    }
    }
    如果((RetVal < 0)&&(RetVal!= SL_ERROR_RESTORE_IMAGE_COMPLETE))、则为其他值
    {
    /*句柄错误*/
    UART_PRINT ("\n sl_Start Failed\n");
    UART_PRINT ("\n %s 示例版本。 %s\n",application_name,application_version);
    while (1);
    }
    
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、 Task_stack_size);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置置备任务线程参数\n");
    while (1);
    }
    
    RetVal = pthread_create (&G) ProvisioningThread、&pAttrs、ProvisioningTask、NULL);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建置备任务线程\n");
    while (1);
    }
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、LINKLOCAL_STACK_SIZE);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置 linkLocalTask 线程参数\n");
    while (1);
    }
    
    RetVal = pthread_create (&G) LinklocalThread、&pAttrs、linkLocalTask、NULL);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 linkLocalTask 线程\n");
    while (1);
    }
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、control_stack_size);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置 controlTask 线程参数\n");
    while (1);
    }
    
    RetVal = pthread_create (&gControlThread、&pAttrs、controlTask、NULL);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 controlTask 线程\n");
    while (1);
    }
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 5;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、task_stack_size);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置 otaTask 线程参数\n");
    while (1);
    }
    
    RetVal = pthread_create (&gOtaThread、&pAttrs、otaTask、NULL);
    
    if (RetVal)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 otaTask 线程\n");
    while (1);
    }
    
    //********* /
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、timer_stack_size);
    
    if (重定位)
    {
    /*句柄错误*/
    UART_PRINT ("无法配置 TimerTask 线程参数\n");
    while (1);
    }
    
    RetVal = pthread_create (&gtimerThread、&pAttrs、TimerTask、NULL);
    
    if (重定位)
    {
    /*句柄错误*/
    UART_PRINT ("无法创建 TimerTask 线程\n");
    while (1);
    }
    //********* /
    
    
    //********* /
    /*以微秒为单位的周期和占空比*/
    Timer_handle timer0;
    Timer_Params 参数;
    
    /*调用驱动程序初始化函数*/
    timer_init();
    
    /*关闭用户 LED */
    GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_OFF);
    
    /*将计时器设置为连续回调模式,以调用回调
    *每1、000、000微秒或1秒运行一次。
    *
    Timer_Params_init (&params);
    params.period = 10000000;
    Params.periodUnits = Timer_Period_US;
    params.timerMode = Timer_Continuous_callback;
    params.timerCallback = timerCallback;
    
    timer0 = Timer_open (Board_TIMER0、params);
    
    if (timer0 == NULL){
    /*初始化计时器失败*/
    while (1);
    }
    
    如果(Timer_start (timer0)= Timer_STATUS_ERROR){
    /*无法启动计时器*/
    while (1);
    ??//********* /
    
    return (0);
    }
    
    
    void timerCallback (Timer_handle myHandle)
    {
    UART_PRINT ("定时器中断\r\n");
    SEM_post (&timerStartSignal);
    
    }
    
    void * TimerTask (void * pvParameters)
    {
    while (1)
    {
    SEM_WAIT (&timerStartSignal);
    UART_PRINT ("定时器任务\r\n");
    slDateTime_t DateTime ={0};
    uint8_t configLen = sizeof (slDateTim_t);
    uint8_t configOpt = sl_device_General_date_time;
    sl_DeviceGet (sl_device_General、&configOpt、&configLen、(uint8_t *)(&DateTime));
    UART_PRINT ("日期%d、星期一%d、年%d、小时%d、最小%d、安全%d\r\n"、DateTime.tm_day、DateTime.tm_mon、DateTime.tm_year、DateTime.tm_hour、DateTimeTM_min、DateTimeTM_min、DateTimeTM_sec);
    }
    
    

    此代码为我提供以下输出、显示从不更新的时间以及 Web 服务器不再响应

    定时器中断
    定时器任务
    Day 0、Mon 0、Year 0、Hour 0、Min 0、Sec 0
    定时器中断
    定时器任务
    Day 0、Mon 0、Year 0、Hour 0、Min 0、Sec 0
    定时器中断
    定时器任务
    Day 0、Mon 0、Year 0、Hour 0、Min 0、Sec 0

    堆栈大小:

    #define task_stack_size (2048)

    #define LINKLOCAL_STACK_SIZE (3072)

    #define CONTRAL_STACK_SIZE (2048)

    #define TIMER_STACK_SIZE (1024)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在重新开始执行新的构建并更改调度程序中的任务优先级后、它看起来正在工作。 我仍然不明白为什么秒不更新。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Andrew、

    以 SDK 1.30.01.03开箱即用示例为基础、我设置了电路板并在网络上将其配置为本地接入点。 然后、我添加了您的代码片段、并获得以下输出、显示了预期的计时器计时。

    >>>
    ========================================================================================
    开箱即用示例版本:1.00.00.09
    ========================================================================================

    芯片:0x20000019
    MAC:2.0.0.0
    PHY:2.2.0.4
    NWP:3.3.0.0
    ROM:0
    主机:2.0.1.15
    MAC 地址:11:22:33:33:22:11

    ========================================================================================

    [配置任务]上电唤醒
    [配置任务]检测到的器件是 CC3220SF
    [WLAN 事件] STA 连接到 AP:xxxx-AP、BSSID:AA:bb:cc:dd:ee:ff
    [NetApp 事件]获取的 IP:IP=192.168.0.101,Gateway=192.168.0.1
    [配置任务]连接到 AP 成功
    [配置任务] IP 地址为192.168.0.101
    定时器中断
    定时器任务
    Day 1、Mon 1、Year 2013、Hour 0、Min 1、Sec 52
    定时器中断
    定时器任务
    Day 1、Mon 1、Year 2013、Hour 0、Min 2、Sec 2
    定时器中断
    定时器任务
    Day 1、Mon 1、Year 2013、Hour 0、Min 2、Sec 12
    定时器中断
    定时器任务
    Day 1、Mon 1、Year 2013、Hour 0、Min 2、Sec 22

    <<<

    我所做的唯一更改是_U16 configLen。

    您能否确认这与您所遵循的步骤相同?

    ~Roger
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我现在得到秒。  

    另一个注意事项。  我正在尝试让器件在接入点模式下从上电启动、而不是在无需使用 SW2的情况下进行配置。  我需要做的似乎就是在    Provisioning.c 中将 Provisioning_mode PrvsnMode_APSC 更改为 Provisioning_mode PrvsnMode_AP、但它似乎不起作用。  我得到下面的输出。  它看起来是在一个奇怪的状态下启动的、在这个状态下、时间读取全部为零、网页不再工作。

    [NetApp 事件]获取的 IP:IP=10.123.45.1,Gateway=10.123.45.1

           ========================================================================================
              开箱即用示例版本:1.00.00.09
           ========================================================================================

            芯片:0x30000018
            MAC: 2.0.0.0
            PHY: 2.2.0.4
            NWP: 3.3.0.0
            ROM: 0
            主机:2.0.1.15
            MAC 地址:04:A3:16:45:5c:db

           ========================================================================================

    [配置任务]上电唤醒
    [配置任务]检测到的器件是 CC3220RS
    [NetApp 事件]获取的 IP:IP=10.123.45.1,Gateway=10.123.45.1
    [配置任务]器件作为工作站启动
    2017年5月16日、06:53:49
    使能
    2017年5月16日、06:53:50
    使能
    2017年5月16日、06:53:51
    使能
    2017年5月16日、06:53:52
    使能
    2017年5月16日、06:53:53
    使能
    [配置任务]无法连接到 AP 或配置文件不存在
    [NetApp 事件]获取的 IP:IP=10.123.45.1,Gateway=10.123.45.1
    [配置任务]器件配置为默认状态
    0/0/0/0、00:00:00
    使能
    [配置任务]器件以 AP 角色启动
    [NetApp 事件]获取的 IP:IP=10.123.45.1,Gateway=10.123.45.1
    [配置任务]主机驱动程序版本:2.0.1.15
    [配置任务]构建版本3.3.0.31.2.0.2.2.0.4
    [配置任务]在模式0中启动配置-[配置任务](0 = AP、1 = SC、2 = AP+SC)
    [配置任务]配置已启动。 正在等待配置..!!
    0/0/0/0、00:00:00
    使能
    0/0/0/0、00:00:00
    使能
    0/0/0/0、00:00:00
    使能
    0/0/0/0、00:00:00
    使能

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Andrew、

    是的、配置模式是一种特殊模式、它限制了在此期间可以调用的 API。  [这是因为管理配置过程的网络处理器可能在配置过程中切换角色,并且无法处理来自主机的请求。]  如果您记录了对 sl_DeviceGet ()的调用返回,则应该会看到它报告返回代码(-2014 =sl_RET_CODE_PROVISIONING_IN_PROGRESS),指示该时间值尚未填充。  配置完成后、可使用 API 来检索时间。

    out_of 框示例支持绕过配置模式并直接启动到 AP 模式。  如您所见、这可以通过按下 SW2按钮来触发、该按钮会终止配置过程、将器件配置为 AP 模式、并设置在休眠重启(OCR/OCP)期间保留的变量。  然后、它会重新启动 MCU、并检查该寄存器、要么在 AP 模式下继续、要么启动配置过程...

    我假设这仅用于测试和开发、并且避免了重新启动周期的需要、因此、如果您希望在不按下按钮的情况下启动此模式、 您希望使用 out_for_box 示例'As is (按原样)的其余部分,快速方法是在启动配置任务之前(例如,在调用 DisplayBanner()代码之后)设置相同的模式和变量。

    RetVal = sl_Start (0、0、0);
    如果(RetVal >= 0)
    {
    uint32_t ocpRegVal;
    
    DisplayBanner (application_name、application_version);
    
    /*无论当前模式如何,均设置 AP 模式*/
    RetVal = sl_WlanSetMode (Role_AP);
    
    /*检查切换到 AP 命令是否成功*/
    如果(RetVal = 0)
    {
    UART_PRINT ("信号 AP 模式->配置任务(通常由 SW2处理程序完成)\n\n");
    
    /*在 OCP 寄存器上指示 AP 角色*/
    ocpRegVal = MAP_PRCMOCRRegisterRead (OCP_REGISTER_INDEX);
    ocpRegVal |=(1<<OCP_REGISTER_OFFSET);
    MAP_PRCMOCRRegisterWrite (OCP_REGISTER_INDEX、ocpRegVal);
    }
    
    RetVal = sl_Stop (sl_stop_timeout);
    如果(RetVal < 0)
    {
    /*句柄错误*/
    UART_PRINT ("\n SL_Stop 失败\n");
    while (1);
    }
    } 

    ~Roger

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的参与。 老实说、最后我只想将其用作 AP
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很棒!

    很高兴现在可以正常工作。

    好的、如果您只想使用 AP 模式、您可以显著简化。  下面是一个示例流程(没有适当的错误处理)、但根据您在上述用例中的 FYI。

    void *mainThread( void *arg ){
    
    内部32_t 返回值;
    pthread_attr_t pAttrs;
    pthread_attr_t pAttrs_spawn;
    struct sched_param primParam;
    
    Timer_handle timer0;
    Timer_Params Params;
    
    Board_initSPI();
    timer_init();
    InitTerm();
    
    /*创建 sl_Task */
    pthread_attr_init (&pAttrs_spawn);
    priParam.sched_priority = sawn_task_priority;
    RetVal = pthread_attr_setschedparam (&pAttrs_spawn、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs_spawn、task_stack_size);
    
    if (RetVal){for (;;);/* Handle Error */}
    
    RetVal = pthread_create (&gSpawnThread、&pAttrs_sprawn、sl_Task、NULL);
    
    if (RetVal){for (;;);/* Handle Error */}
    
    RetVal = sl_Start (0、0、0);
    
    if (RetVal < 0){for (;;);/* Handle Error */}
    
    if (RetVal!= role_AP){
    
    RetVal = sl_WlanSetMode (Role_AP);
    
    if (RetVal < 0){for (;;);/* Handle Error */}
    
    RetVal = sl_Stop (sl_stop_timeout);
    
    if (RetVal < 0){for (;;);/* Handle Error */}
    
    RetVal = sl_Start (0、0、0);
    
    if (RetVal!= role_AP){
    if (RetVal < 0){ for (;;);/* Handle Error */}
    
    }
    
    DisplayBanner (application_name、application_version);
    
    SEM_INIT (&timerStartSignal、0、0);
    
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;
    RetVal = pthread_attr_setschedparam (&pAttrs、&priParam);
    RetVal |= pthread_attr_setstacksize (&pAttrs、timer_stack_size);
    
    if (RetVal){for (;;);/* Handle Error */}
    
    RetVal = pthread_create (&gtimerThread、&pAttrs、TimerTask、NULL);
    
    if (RetVal){for (;;);/* Handle Error */}
    
    Timer_Params_init (&params);
    params.period = 10000000;
    Params.periodUnits = Timer_Period_US;
    params.timerMode = Timer_Continuous_callback;
    params.timerCallback = timerCallback;
    
    timer0 = Timer_open (Board_TIMER0、params);
    
    if (timer0 == NULL){for (;;);}
    
    if (Timer_start (timer0)= Timer_STATUS_ERROR){for(;);}
    
    return (0);
    }
    
    
    void timerCallback (Timer_handle myHandle)
    {
    UART_PRINT ("定时器中断\r\n");
    SEM_post (&timerStartSignal);
    }
    
    void * TimerTask (void * pvParameters)
    {
    _i16转塔;
    
    while (1){
    SEM_WAIT (&timerStartSignal);
    UART_PRINT ("定时器任务\r\n");
    slDateTime_t DateTime ={0};
    _U16 configLen = sizeof (slDateTim_t);
    uint8_t configOpt = sl_device_General_date_time;
    RET = sl_DeviceGet (sl_device_General、&configOpt、&configLen、(uint8_t *)(&DateTime));
    UART_PRINT ("[%d]:Day %d、Mon %d、Year %d、Hour %d、min %d、Sec %d\r\n"、
    RET、
    DateTimeTM_Day、DateTimeTM_mon、DateTimeTM_year、
    DateTimeTM_Hour、DateTimeTM_min、DateTimeTM_sec);
    }
    }
    

    ~Roger

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您的帮助和专业知识。  我将把它添加到 TODO 列表中。  

    是否有任何有关添加您自己的自定义 Get 和 POST 的文档?  我正在浏览代码、大致了解红色 LED 的工作情况。  它显示了全部从 SimpleLinkNetAppRequestEventHandler()开始的整个过程。  但是,它显示了在  linkLocalTask()中启动 httpGetHandler()和 httpPostHandler()的事件链。   我看不到 SimpleLinkNetAppRequestEventHandler()和 linkLocalTask()之间的链接。   我 还在尝试确定在何处放置一些适当的 printf 语句、以查看哪些数据实际上从 Web 服务器传递到 LED 的 Get 和 POST 回调函数。  

    到目前为止,我在 http_RequestObj_t 中为我的自定义 Get 和 POST 添加了另外两个 URI 服务,并将它们添加到 initLinkLocalDB()。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    当然、没问题。 很高兴为您提供帮助。

    HTTP 服务器的主要文档位于 www.ti.com/.../swru455a.pdf第9章。

    请仔细阅读该章、如果您的疑问未包含在内、请开始新的主题、以获得任何澄清。

    谢谢、
    ~Roger
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Roger、

    我不想重做这个线程、但在定制板上遇到了一些问题。  我刚才使用了以下代码来强制它进入 AP 模式。

    RetVal = sl_Start (0、0、0);
    如果(RetVal >= 0)
    {
    uint32_t ocpRegVal;
    
    DisplayBanner (application_name、application_version);
    
    /*无论当前模式如何,均设置 AP 模式*/
    RetVal = sl_WlanSetMode (Role_AP);
    
    /*检查切换到 AP 命令是否成功*/
    如果(RetVal = 0)
    {
    UART_PRINT ("信号 AP 模式->配置任务(通常由 SW2处理程序完成)\n\n");
    
    /*在 OCP 寄存器上指示 AP 角色*/
    ocpRegVal = MAP_PRCMOCRRegisterRead (OCP_REGISTER_INDEX);
    ocpRegVal |=(1<<OCP_REGISTER_OFFSET);
    MAP_PRCMOCRRegisterWrite (OCP_REGISTER_INDEX、ocpRegVal);
    }
    
    RetVal = sl_Stop (sl_stop_timeout);
    如果(RetVal < 0)
    {
    /*句柄错误*/
    UART_PRINT ("\n SL_Stop 失败\n");
    while (1);
    }
    } 

    这个问题在定制电路板上、代码输出一条消息"[控制任务]器件尚未启动、请再次按下 SW2按钮"并继续运行、但随后我会出现不稳定的行为、并在结束时一直收到来自"电路板按钮0中断例程"的消息:  "[控制任务]切换到 AP[控制任务]无法将元素发送到消息队列"。  然后、软件处于 while (1)中。

    现在、我已经弄清了、在销毁一个 CC3220MOD 以解决此问题后、CC3220S_Sch.pdf 中的"SW2"与开箱即用演示中的 SW2不匹配。  也就是说、GPIO_22保持悬空、而 GPIO_13 (明显不是 SW2)连接到逻辑电平。  我使用下拉电阻器板、然后触发 SW2为高电平、现在"[Control task] device is not started yet、please press SW2 button again"消息在引导时消失、至少似乎我不再收到消息队列错误。

    如果 SW2从未被按下至少一次、上述代码一定不能工作?  是否有正在写入闪存的内容依赖于至少按下 SW2一次?  我只是想更好地了解正在发生的情况、以便开始为我的应用清理不必要的代码。