caihaitao
caihaitao
This guy hasn't written anything yet

注册于 7 months ago

回答
19
文章
0
关注者
0

/* try to find object */
for (node  = information->object_list.next;
        node != &(information->object_list);
        node  = node->next)
{
    struct rt_object *obj;

    obj = rt_list_entry(node, struct rt_object, list);
    if (obj) /* skip warning when disable debug */
    {
        RT_ASSERT(obj != object);        //程序运行到这里,产生assert;
    }
}

可能的原因就是你在初始化某一个组件的时候,重复执行了相关的初始化函数;这个for循环的作用就是遍历对象容器,如果要初始化的对象已经在对象容器当中,就不用再次初始化。

仔细排查下你的代码,是否重复注册同一个I2C总线啦。

你写的函数,最后一定会执行__exit的地方的,如果上面的线程和定时器创建成功的话,那线程和定时器直接就被删除啦。这种写法有错误的,

void ec200_tcp_heart(void)
{
    static rt_thread_t  heart_thread_tid = RT_NULL;
    static rt_timer_t heart_timer_tid = RT_NULL;

    heart_thread_tid = rt_thread_create("heart_thread",
                                        ec200_heart_entry,
                                        RT_NULL,
                                        THREAD_STACK_SIZE,
                                        THREAD_PRIORITY,
                                        THREAD_TIMESLICE);
    if (heart_thread_tid != RT_NULL)
    {
        rt_thread_startup(heart_thread_tid);
        rt_kprintf("heart_thread startup!\n");
    }
    else
    {
        goto __exit;
    }


    heart_timer_tid = rt_timer_create("heart_timer",
                                      ec200_heart_timer,
                                      RT_NULL,
                                      10,
                                      RT_TIMER_FLAG_PERIODIC);
    if(heart_timer_tid != RT_NULL)
    {
        rt_timer_start(heart_timer_tid);
        rt_kprintf("heart_timer startup!\n");
    }
    else
    {
        goto __exit;
    }
    
    return ;

__exit:
    if (heart_thread_tid)
        rt_thread_delete(heart_thread_tid);
    if(heart_timer_tid)
        rt_timer_delete(heart_timer_tid);
}

添加下return,估计执行就没问题啦。

可以先停止:
rt_timer_stop

然后,在重新设置时间;如果有需要的话:
rt_timer_control

最后,再次开启:
rt_timer_stop

你需要确认有没有开启软件定时器的宏,在创建定时器时也要设置相关的标志。

根据你的代码,LED灯应该是常亮的。

static void thread2_entry(void *parameter)
{
    rt_event_send(&event, KEY1_FLAG);        //线程运行会发送一次事件,之后此线程就结束了
}

static void thread1_entry(void *parameter)

函数里面会接收到一次事件之后,如果能够接收成功,则点亮LED,延时之后,会再次接收事件,但是发送事件的线程已经运行结束了,没法再次发送事件了。
所以,LED灯是常亮的。

可以通过获取rt_messagequeue结构体变量中的entry成员变量,我查看了nano的源代码,里面没有提供获取当前消息数量的函数。

在大点的项目中长度为8是不够的,建议将RT_NAME_MAX宏设置为16

在一个群里已经找到答案了。谢谢大家。

目的可能就是不依赖C库吧。有些编译器使用的C库版本还不一样。

中断处理函数中有没有清楚中断标志,STM32系列的芯片如果没有清楚中断标志的话,会一直向CPU请求中断。

线程优先级那个高?
新建线程处理函数中有没有使用可能导致上下文切换的API函数。
如果新建线程的优先级高,在处理函数中也没有调用引起线程切换的API函数;那就会在新建线程的处理函数中一直循环执行。

rt_enter_critical(); //可以省略
关闭中断之后,SysTick的中断也被屏蔽了,暂时无法得到执行。不会发生线程调度。

Cortex-M系列芯片栈是满减的;栈最高位置是:(0x20006C8C + 0x2800);现在栈指针为:0x200093DC,随着程序的运行,sp的值是动态调整的;只要sp的值不小于0x20006C8C,说明栈是没有溢出的。

发布
问题