geniusgogo
geniusgogo - 认证专家

注册于 8 years ago

回答
12
文章
0
关注者
6

建议采用多文件方式,将日志分割到多个文件中,然后管理多个文件循环覆盖。
例如:file1.log file2.log file3.log, 等待file3.log写满了就删除file1.log,新建一个file1.log重新写(不要采用覆盖写,文件越大覆盖写越慢)。

首先你所说的定时器时钟是给OS TICK用的吗?如果是那么通常RT_TICK_PER_SECOND宏就是OS TICK的频率。
如果对应到你的硬件定时器,那么你可以先看看你的硬件定时器中断是不是1KHz。

这里一个线程挂起之后,要将rt_thread_ready_priority_group对应优先级的位清0,但是一个优先级有其他的线程。如果清0不就无法访问到其他线程了吗?
你的截图上并不是将一个任务的优先级清0,是当这个优先级组没有任务就绪的情况下才会清0.注意这里的组划分。

这里的 RT_TICK_MAX / 2要怎么理解呢?
这里的RT_TICK_MAX是rt_tick_t类型最大的数值取值。通常是无符号类型,那么一个rt_tick_t变量取值就是从0到RT_TICK_MAX。为了判断是否超时,通常系统里就限制定时器的超时设定不能大于这个数值范围的一半。然后这样在判断超时的时候就可以这样判断 if (rt_tick_get() - timer->timeout_tick < (RT_TICK_MAX / 2)) 超时了; else 没超时,或者超时太久太久了,定时器都跑超时一圈了。 所以通常情况下系统不会阻塞到太久太久以至于超时一圈了。

不但会交叉还会出现乱码(前一个还没从移位寄存器里移走,后来的就会冲走前面的),所以要做互斥的。

有什么问题吗?网口灯亮了没有?时钟正常了吗?
插拔一下网线看看这个状态寄存器有变化没。

系统有不影响实时性的延时函数:rt_thread_delay()
前提是使用此函数前不要关闭调度器,不要关闭中断,并只在任务中使用。

最新发现:调整了优先级后,uhfproc里send的时候,会与LWIP的tcpip任务抢锁,导致uhfproc锁死。感觉与上面原始问题是同一个根源。
LWIP里tcpip任务拿了mu0的锁之后,又获取e0信号量失败,导致tcpip挂起在e0上。而此时uhfproc任务又调用send去获取mu0挂起,这就发生了应用层任务假死现象。但是不清楚为什么tcpip会一直获取不到e0。

thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
tshell     2  running 0x00000068 0x00001000    08%   0x00000005 000
uhfproc   12  suspend 0x00000140 0x00000800    30%   0x00000005 000
uhfscan   11  ready   0x000000a8 0x00000400    21%   0x00000003 -02
pp        14  suspend 0x00000078 0x00000800    27%   0x00000005 000
nwkrx     13  suspend 0x00000170 0x00000800    27%   0x00000008 000
led        5  suspend 0x00000070 0x00000200    26%   0x00000007 000
beeper     5  suspend 0x00000070 0x00000200    21%   0x0000000a 000
sfwdt      0  suspend 0x00000060 0x00000200    34%   0x0000000a 000
tcpip     10  suspend 0x000001c0 0x00000800    23%   0x0000000b 000
etx       15  ready   0x00000074 0x00000800    07%   0x00000008 000
erx       15  suspend 0x0000007c 0x00000800    19%   0x0000000b 000
tidle0    31  ready   0x00000058 0x00000100    34%   0x0000000b 000
timer      1  suspend 0x00000060 0x00000400    13%   0x00000009 000
msh />list_mutex
mutex      owner  hold suspend thread
-------- -------- ---- --------------
uhf      uhfscan  0001 0
led      (NULL)   0000 0
beeper   (NULL)   0000 0
wdmtx    (NULL)   0000 0
lfsmtx   (NULL)   0000 0
flash0   (NULL)   0000 0
**mu0      tcpip    0001 2**
fslock   (NULL)   0000 0
spi2     (NULL)   0000 0
semaphore v   suspend thread
-------- --- --------------
sem0     000 0
shrx     000 0
e0       000 1:tcpip
heap     001 0

看样子你的bootloader也是使用了RT-Thread哈?那就不奇怪了,试想问一下是否也同样是在CortexM处理器上跑的?那就更加不奇怪了,你想哈,你在跳转前,bootloader的CPU模式是什么?handle、thread?
如果是thread模式下你能正常修改msp吗?如果没法修改msp,那你的跳转是否就存在问题了?栈飞了吧!!!

cat.1就像普通的2G、4G一样随便一个手机卡就能跑起来上网了,但是NB、lora可不一样。
例如NB,在深圳这边电信运营商是不对个人用户开放业务的。所以要想个人玩起来需要依托一个公司背景去申请,才会拿到相关授权。
lora更复杂,个人要想玩起来,除了P2P还需要自个搭建网关,相当于自己做运营商建立网络。如果只是跑个P2P那也就失去意义了,随便搞个无线模块都能收发。
比较倾向于cat.1,至少使用门槛低。而且据说是移动准备过度到5G替代2G的方案。

已经解决了,用一个加载区,两个执行空间,也就是第二种方法解决的。需要在第二个知行区加上FIXED属性。

发布
问题