RT-Thread线程未启动问题分析

RT-Thread线程未启动问题分析

发现问题

最近在学习RT-Thread相关的知识,运行创建线程的例程时发现程序没有跑起来。通过Debug发现,开启线程调度后,线程并没有成功的调度。main函数直接返回了。

int main(void)
{	
	led1_thread =                         
    rt_thread_create( "led1",            
                      led1_thread_entry, 
                      RT_NULL,             
                      512,               
                      3,                  
                      20);               
   if (led1_thread != RT_NULL)
        rt_thread_startup(led1_thread);
    else
        return -1;
}

分析问题

研究了一下RT-Thread启动流程,发现是先执行了rtthread_startup();再进入的main函数。

RT-Thread启动流程

在这里插入图片描述
找到相应的代码如下。我是用的编译工具是keil5.38,按道理应该会进入到$Sub$$main()函数中,实际Debug发现并没有。而且使用__CC_ARM宏修饰的地方是灰色的,__GNUC__修饰的地方是高亮的。

#if defined (__CC_ARM)
extern int $Super$$main(void);
/* re-define main function */
int $Sub$$main(void)
{
    rt_hw_interrupt_disable();
    rtthread_startup();
    return 0;
}
#elif defined(__ICCARM__)
extern int main(void);
/* __low_level_init will auto called by IAR cstartup */
extern void __iar_data_init3(void);
int __low_level_init(void)
{
    // call IAR table copy function.
    __iar_data_init3();
    rt_hw_interrupt_disable();
    rtthread_startup();
    return 0;
}
#elif defined(__GNUC__)
extern int main(void);
/* Add -eentry to arm-none-eabi-gcc argument */
int entry(void)
{
    rt_hw_interrupt_disable();
    rtthread_startup();
    return 0;
}
#endif

查找资料

查找了__CC_ARM相关的资料发现,在arm compiler 5中是有效的。但是arm compiler 6中是无效的。由于我安装的keil是5.38的版本,其中使用的是arm compiler 6。导致了 __CC_ARM失效的问题。

AC5改AC6后_CC_ARM就没有定义了

宏__CC_ARM 是MDK自带的, 在AC5中是__CC_ARM ,AC6中是__clang__。如下
AC5:
#if   defined ( __ICCARM__ )
#elif defined ( __CC_ARM )
#endif

AC6 :
#if   defined ( __ICCARM__ )
  #pragma system_include         /* treat file as system include file for MISRA check */
#elif defined (__clang__)
  #pragma clang system_header   /* treat file as system include file */
#endif

解决问题

两个思路吧,一个是用回原来的 arm compiler 5。一个是解决这个__CC_ARM失效的问题

1、安装arm compiler 5

参考知乎的文章(评论区有好人)

2、先不考虑这个了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RT-Thread 是一个实时操作系统,支持多线程操作。线程RT-Thread 中的基本执行单元,可以通过 RT-Thread 的 API 来创建和管理线程RT-Thread 线程创建 API 主要有以下几个: 1. rt_thread_t rt_thread_create(const char *name, void (*entry)(void *parameter), void *parameter, size_t stack_size, rt_uint8_t priority, rt_uint32_t tick); 该函数用于创建一个线程,参数如下: - name:线程的名称(必填)。 - entry:线程的入口函数(必填)。 - parameter:传递给线程入口函数的参数。 - stack_size:线程栈的大小,以字节为单位。 - priority:线程的优先级,取值范围是 0~31,数值越小优先级越高。 - tick:线程的时间片长度,以系统时钟节拍为单位。 2. void rt_thread_startup(rt_thread_t thread); 该函数用于启动一个线程,参数是线程句柄。 3. rt_thread_t rt_thread_self(void); 该函数返回当前线程的句柄。 4. rt_err_t rt_thread_delete(rt_thread_t thread); 该函数用于删除一个线程,参数是线程句柄。 5. rt_err_t rt_thread_yield(void); 该函数用于让出当前线程的时间片,让其他线程执行。 6. rt_err_t rt_thread_suspend(rt_thread_t thread); 该函数用于挂起一个线程,使其暂停执行。 7. rt_err_t rt_thread_resume(rt_thread_t thread); 该函数用于恢复一个被挂起的线程,使其继续执行。 以上是 RT-Thread 线程创建的几个基本 API,可以根据实际需求选择使用。需要注意的是,线程的优先级和时间片长度是影响线程执行顺序的重要因素,需要根据实际情况进行设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值