rtt studio环境,运行一段时间出现这个线程错误,实在想不明白,第一次接触RTT,求助各位大神。
[16:55:39.596]收←◆
!at!
[16:55:39.799]收←◆psr: 0x21000000
r00: 0x5ff7f06b
r01: 0x2000a8d0
r02: 0x08014798
r03: 0x00000025
r04: 0x2000a8d0
r05: 0x00000025
r06: 0x2000a96c
r07: 0x20001e70
r08: 0x0000000a
r09: 0x2000a624
r10: 0x080162a1
r11: 0x08014798
r12: 0x00000000
lr: 0x08010903
pc: 0x08010fa6
hard fault on thread: lte
thread pri status sp stack size max used left tick error
-------- --- ------- ---------- ---------- ------ ---------- ---
serial8 20 suspend 0x000000a0 0x00000400 27% 0x00000006 000
lte 18 running 0x000000c0 0x00001000 23% 0x00000008 000
serial4 20 suspend 0x000000a0 0x00000400 15% 0x0000000a 000
serial3 20 suspend 0x000000a0 0x00000400 15% 0x0000000a 000
serial2 25 suspend 0x000000a0 0x00000400 15% 0x0000000a 000
at_clnt 9 suspend 0x000000f8 0x00000600 16% 0x00000005 000
tshell 20 suspend 0x000000cc 0x00001000 05% 0x0000000a 000
sys_work 23 suspend 0x00000084 0x00000800 06% 0x0000000a 000
tidle0 31 ready 0x00000074 0x00000400 14% 0x0000000e 000
timer 4 suspend 0x00000080 0x00000200 25% 0x00000009 000
bus fault:
SCB_CFSR_BFSR:0x82 PRECISERR SCB->BFAR:5FF7F06C
#include "lte.h"
#include "at.h"
#include "stdlib.h"
#include "string.h"
#include "stdio.h"
lte_para_typedef lte_para = {0};
at_response_t resp = RT_NULL;
/*******************************************************************************
*4G模块配置
*/
void lte_cfg_init(void)
{
rt_pin_mode(power_en_Pin, PIN_MODE_OUTPUT);
rt_pin_mode(power_key_Pin, PIN_MODE_OUTPUT);
at_client_init("uart7",1024);
resp = at_create_resp(1024, 0, rt_tick_from_millisecond(5000));
}
/*******************************************************************************
*4G模块联网前状态检查
*/
void lte_checkstate_init(void)
{
int ret;rt_uint8_t count;
//参数
__reset_function_entry:
rt_memset(<e_para,0,sizeof(lte_para_typedef));
lte_para.current_state = State_PowerOff_Restart;
rt_kprintf("\r\n!init!\r\n");
//开启
power_enOFF;power_keyOFF;rt_thread_mdelay(2500);
power_EnON;rt_thread_mdelay(10000);
lte_para.current_state = State_AT;
rt_kprintf("\r\n!poweron!\r\n");
//AT
ret=-RT_ETIMEOUT;count = 0;
do
{
count++;ret=at_client_wait_connect(5000);rt_thread_mdelay(100);
}while((ret != RT_EOK)&&(count<3));
if(ret != RT_EOK){goto __reset_function_entry;}
lte_para.current_state = State_ATE0;
rt_kprintf("\r\n!at!\r\n");
//关闭回显
ret=-RT_ETIMEOUT;count = 0;
do
{
count++;
ret=at_exec_cmd(resp,"ATE0");
rt_thread_mdelay(100);
if(ret == RT_EOK)
{
ret=-RT_ETIMEOUT;
if(rt_strstr("\r\nOK\r\n",at_resp_get_line(resp,2))!=RT_NULL)
{
ret = RT_EOK;
}
}
}while((ret != RT_EOK)&&(count<3));
if(ret != RT_EOK){goto __reset_function_entry;}
lte_para.current_state = State_CGMM;
//模块型号
ret=-RT_ETIMEOUT;count = 0;
do
{
count++;
ret=at_exec_cmd(resp,"AT+CGMM");
rt_thread_mdelay(100);
if(ret == RT_EOK)
{
at_resp_parse_line_args(resp,2,"%s",lte_para.M_Model);
rt_kprintf("\r\nM_Model:%s!\r\n",lte_para.M_Model);
}
}while((ret != RT_EOK)&&(count<3));
if(ret != RT_EOK){goto __reset_function_entry;}
lte_para.current_state = State_CGMR;
//模块固件版本号
ret=-RT_ETIMEOUT;count = 0;
do
{
count++;
ret=at_exec_cmd(resp,"AT+CGMR");
rt_thread_mdelay(100);
if(ret == RT_EOK)
{
at_resp_parse_line_args(resp,2,"%s",lte_para.Firmware_version);
rt_kprintf("\r\nFirmware_version:%s!\r\n",lte_para.Firmware_version);
}
}while((ret != RT_EOK)&&(count<3));
if(ret != RT_EOK){goto __reset_function_entry;}
lte_para.current_state = State_QCCID;
//请求SIM卡的ICCID
ret=-RT_ETIMEOUT;count = 0;
do
{
count++;
ret=at_exec_cmd(resp,"AT+QCCID");
rt_thread_mdelay(100);
if(ret == RT_EOK)
{
at_resp_parse_line_args(resp,2,"+QCCID: %s",lte_para.SIM_CCID);
rt_kprintf("\r\nSIM_CCID:%s!\r\n",lte_para.SIM_CCID);
}
}while((ret != RT_EOK)&&(count<3));
if(ret != RT_EOK){goto __reset_function_entry;}
lte_para.current_state = State_CIMI;
//请求SIM卡的IMSI
ret=-RT_ETIMEOUT;count = 0;
do
{
count++;
ret=at_exec_cmd(resp,"AT+CIMI");
rt_thread_mdelay(100);
if(ret == RT_EOK)
{
at_resp_parse_line_args(resp,2,"%s",lte_para.IMSI);
rt_kprintf("\r\nIMSI:%s!\r\n",lte_para.IMSI);
}
}while((ret != RT_EOK)&&(count<3));
if(ret != RT_EOK){goto __reset_function_entry;}
lte_para.current_state = State_CGSN;
//产品IMEI
ret=-RT_ETIMEOUT;count = 0;
do
{
count++;
ret=at_exec_cmd(resp,"AT+CGSN");
rt_thread_mdelay(100);
if(ret == RT_EOK)
{
at_resp_parse_line_args(resp,2,"%s",lte_para.IMEI);
rt_kprintf("\r\nIMEI:%s!\r\n",lte_para.IMEI);
}
}while((ret != RT_EOK)&&(count<3));
if(ret != RT_EOK){goto __reset_function_entry;}
lte_para.current_state = State_CPIN;
//是否附着网络
ret=-RT_ETIMEOUT;count = 0;
do
{
count++;
ret=at_exec_cmd(resp,"AT+CPIN?");
rt_thread_mdelay(100);
if(ret == RT_EOK)
{
ret=-RT_ETIMEOUT;
if(rt_strstr(at_resp_get_line(resp,2),"READY")!=RT_NULL)
{
ret = RT_EOK;
}
rt_kprintf("\r\nAT+CPIN?back:%s!\r\n",at_resp_get_line(resp,2));
}
}while((ret != RT_EOK)&&(count<3));
if(ret != RT_EOK){goto __reset_function_entry;}
lte_para.current_state = State_CSQ;
}
/*******************************************************************************
*4G模块工作
*/
void lte_thread_entry(void *parameter)
{
while(1)
{
lte_checkstate_init();
}
}
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-05-18 RT-Thread first version
*/
#include <rtthread.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include <board.h>
#include "uartx.h"
#include "systemrunx.h"
#include "lte.h"
int main(void)
{
rt_thread_t thread;
rt_timer_t systemLed;
hardware_gpio_cfg();
uartx_config();
lte_cfg_init();
syspara_cfg();
/*debug*/
thread = rt_thread_create("serial2", serial2_thread_entry, RT_NULL, 1024, 25, 10);
if(thread != RT_NULL){rt_thread_startup(thread);}
/*驱动板*/
thread = rt_thread_create("serial3", serial3_thread_entry, RT_NULL, 1024, 20, 10);
if(thread != RT_NULL){rt_thread_startup(thread);}
/*LCD*/
thread = rt_thread_create("serial4", serial4_thread_entry, RT_NULL, 1024, 20, 10);
if(thread != RT_NULL){rt_thread_startup(thread);}
/*4g moudle*/
thread = rt_thread_create("lte", lte_thread_entry, RT_NULL, 4096, 18, 20);
if(thread != RT_NULL){rt_thread_startup(thread);}
/*wifi*/
thread = rt_thread_create("serial8", serial8_thread_entry, RT_NULL, 1024, 20, 10);
if(thread != RT_NULL){rt_thread_startup(thread);}
/*sys_led*/
systemLed = rt_timer_create("led", system_led_entry, RT_NULL, 2000, RT_TIMER_FLAG_PERIODIC);
if(systemLed != RT_NULL) rt_timer_start(systemLed);
/*ec20_step*/
return RT_EOK;
}
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-05-20 Administrator the first version
*/
#include "systemrunx.h"
#include "uartx.h"
//系统运行指示灯GPIO配置
void sysled_gpio_cfg(void)
{
rt_pin_mode(LED_Pin, PIN_MODE_OUTPUT);
}
//GPIO初始化
void hardware_gpio_cfg(void)
{
sysled_gpio_cfg();
}
//参数初始化
void syspara_cfg(void)
{
}
void system_led_entry(void *parameter)
{
static u_int8_t flag = PIN_LOW;
rt_pin_write(LED_Pin, flag);
if(flag == PIN_LOW){flag = PIN_HIGH;}
else{flag = PIN_LOW;}
}
一下是串口打印信息
[16:54:44.165]收←◆\0
[16:54:47.476]收←◆
\ | /
- RT - Thread Operating System
/ | \ 4.0.3 build Jun 16 2022
2006 - 2020 Copyright by rt-thread team
[32m[I/sal.skt] Socket Abstraction Layer initialize success.[0m
[32m[I/at.clnt] AT client(V1.3.1) on device uart7 initialize success.[0m
!init!
msh >
[16:54:59.862]收←◆
!poweron!
[16:54:59.965]收←◆
!at!
[16:55:00.170]收←◆
M_Model:EC20F!
[16:55:00.276]收←◆
Firmware_version:EC20CEHDLGR06A07M1G!
[16:55:00.383]收←◆
SIM_CCID:89861118211034912320!
[16:55:00.490]收←◆
IMSI:460113307674877!
[16:55:00.596]收←◆
IMEI:865396055663872!
[16:55:00.704]收←◆
AT+CPIN?back:+CPIN: READY!
!init!
[16:55:13.070]收←◆
!poweron!
[16:55:13.174]收←◆
!at!
[16:55:13.379]收←◆
M_Model:EC20F!
[16:55:13.484]收←◆
Firmware_version:EC20CEHDLGR06A07M1G!
[16:55:13.593]收←◆
SIM_CCID:89861118211034912320!
[16:55:13.703]收←◆
IMSI:460039521054241!
[16:55:13.810]收←◆
IMEI:865396055663872!
[16:55:13.918]收←◆
AT+CPIN?back:+CPIN: READY!
!init!
[16:55:26.286]收←◆
!poweron!
[16:55:26.390]收←◆
!at!
[16:55:26.596]收←◆
M_Model:EC20F!
[16:55:26.700]收←◆
Firmware_version:EC20CEHDLGR06A07M1G!
[16:55:26.809]收←◆
SIM_CCID:89861118211034912320!
[16:55:26.919]收←◆
IMSI:460039521054241!
[16:55:27.026]收←◆
IMEI:865396055663872!
[16:55:27.132]收←◆
AT+CPIN?back:+CPIN: READY!
!init!
[16:55:39.495]收←◆
!poweron!
[16:55:39.596]收←◆
!at!
[16:55:39.799]收←◆psr: 0x21000000
r00: 0x5ff7f06b
r01: 0x2000a8d0
r02: 0x08014798
r03: 0x00000025
r04: 0x2000a8d0
r05: 0x00000025
r06: 0x2000a96c
r07: 0x20001e70
r08: 0x0000000a
r09: 0x2000a624
r10: 0x080162a1
r11: 0x08014798
r12: 0x00000000
lr: 0x08010903
pc: 0x08010fa6
hard fault on thread: lte
thread pri status sp stack size max used left tick error
-------- --- ------- ---------- ---------- ------ ---------- ---
serial8 20 suspend 0x000000a0 0x00000400 27% 0x00000006 000
lte 18 running 0x000000c0 0x00001000 23% 0x00000008 000
serial4 20 suspend 0x000000a0 0x00000400 15% 0x0000000a 000
serial3 20 suspend 0x000000a0 0x00000400 15% 0x0000000a 000
serial2 25 suspend 0x000000a0 0x00000400 15% 0x0000000a 000
at_clnt 9 suspend 0x000000f8 0x00000600 16% 0x00000005 000
tshell 20 suspend 0x000000cc 0x00001000 05% 0x0000000a 000
sys_work 23 suspend 0x00000084 0x00000800 06% 0x0000000a 000
tidle0 31 ready 0x00000074 0x00000400 14% 0x0000000e 000
timer 4 suspend 0x00000080 0x00000200 25% 0x00000009 000
bus fault:
SCB_CFSR_BFSR:0x82 PRECISERR SCB->BFAR:5FF7F06C
啥解决的
目前把main里面的其他线程注释掉,只保留lte那个线程,运行一个晚上,正常的。这个rtt的main和freertos的main不一样好像,之前刚接触时候说rtt的main其实也是一个线程,现在在看看哪里把main一些参数调整一下。看看之前rtt的资料,不太记得了。