OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5615|回复: 15

CMSIS-RTOS创建线程失败

[复制链接]

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
发表于 2016-9-26 19:58:11 | 显示全部楼层 |阅读模式
1金钱
最近在学习CMSIS-ROTS,创建线程。代码如下:
void  mmThread(void const *arg);
osThreadDef(mmThread,osPriorityNormal,2,496);
osThreadId  tid;

void mmThread(void const *arg)
{
        while(1)
        {
                printf("enter thread.\r\n");
                osThreadYield();
        }
}

int main(void)
{
        //初始化CMSIS_OS
        osKernelInitialize();
        //初始化调试串口
        stdout_init();

        tid = osThreadCreate(osThread(mmThread),NULL);  //DHCP循环线程
        if(tid == NULL)
        {
                printf("creat thread faild.\r\n");
        }

        //CMSIS_OS启动
        osKernelStart();

       
        while(1);
}


问题出现在:osThreadDef(mmThread,osPriorityNormal,2,496);
函数的第三个参数是设置堆栈的大小,如果是0表示默认堆栈大小。如果我设置0,那么程序没问题。如果我 0 改成其它的数字就创建线程失败!!

各位大神有没有调通了的?

最佳答案

查看完整内容[请看2#楼]

如果自己定义了任务堆栈大小,创建任务时要从os_stack_mem里分配任务堆栈大小,见下: /// Create a thread and add it to Active Threads and set it to state READY osThreadId svcThreadCreate (const osThreadDef_t *thread_def, void *argument) { P_TCB ptcb; OS_TID tsk; void *stk; if ((thread_def == NULL) || (thread_def->pthread == NULL) || (thread_def->tpriority < osPriority ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2016-9-26 19:58:12 | 显示全部楼层
本帖最后由 科科1987 于 2016-9-29 09:47 编辑
moxigua 发表于 2016-9-28 20:33
有没有谁,解决这个问题了????

如果自己定义了任务堆栈大小,创建任务时要从os_stack_mem里分配任务堆栈大小,见下:
/// Create a thread and add it to Active Threads and set it to state READY
osThreadId svcThreadCreate (const osThreadDef_t *thread_def, void *argument) {
  P_TCB  ptcb;
  OS_TID tsk;
  void  *stk;

  if ((thread_def == NULL) ||
      (thread_def->pthread == NULL) ||
      (thread_def->tpriority < osPriorityIdle) ||
      (thread_def->tpriority > osPriorityRealtime)) {
    sysThreadError(osErrorParameter);
    return NULL;
  }

  if (thread_def->stacksize != 0) {             // Custom stack size
    stk = rt_alloc_mem(                         // Allocate stack
      os_stack_mem,
      thread_def->stacksize
    );

    if (stk == NULL) {
      sysThreadError(osErrorNoMemory);          // Out of memory
      return NULL;
    }
  } else {                                      // Default stack size
    stk = NULL;
  }

  tsk = rt_tsk_create(                          // Create task
    (FUNCP)thread_def->pthread,                 // Task function pointer
    (thread_def->tpriority-osPriorityIdle+1) |  // Task priority
    (thread_def->stacksize << 8),               // Task stack size in bytes
    stk,                                        // Pointer to task's stack
    argument                                    // Argument to the task
  );

  if (tsk == 0) {                               // Invalid task ID
    if (stk != NULL) {
      rt_free_mem(os_stack_mem, stk);           // Free allocated stack
    }
    sysThreadError(osErrorNoMemory);            // Create task failed (Out of memory)
    return NULL;
  }

  ptcb = (P_TCB)os_active_TCB[tsk - 1];         // TCB pointer

  *((uint32_t *)ptcb->tsk_stack + 13) = (uint32_t)osThreadExit;

  return ptcb;
}

但是如果os_stack_mem的小于分配的堆栈大小的话,创建任务就会失败。
/* Memory pool for user specified stack allocation (+main, +timer) */
uint64_t       os_stack_mem[2+OS_PRIV_CNT+(OS_STACK_SZ/8)];


在RTX_Conf_CM.c文件里:
//   <o>Total stack size [bytes] for threads with user-provided stack size <0-1048576:8><#/4>
//   <i> Defines the combined stack size for threads with user-provided stack size.
//   <i> Default: 0
#ifndef OS_PRIVSTKSIZE
#define OS_PRIVSTKSIZE 2       // this stack size value is in words
#endif

把这个值改大一些,比如改成50(按照4个字节算的,200bytes)


总之,自己配置任务堆栈大小 ,根据实际情况配置:
//   <o>Number of threads with user-provided stack size <0-250>
//   <i> Defines the number of threads with user-provided stack size.
//   <i> Default: 0
#ifndef OS_PRIVCNT
#define OS_PRIVCNT     1
#endif

//   <o>Total stack size [bytes] for threads with user-provided stack size <0-1048576:8><#/4>
//   <i> Defines the combined stack size for threads with user-provided stack size.
//   <i> Default: 0
#ifndef OS_PRIVSTKSIZE
#define OS_PRIVSTKSIZE 50
#endif
永远保持一颗学习的心态。
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-9-26 20:07:43 | 显示全部楼层
就是创建线程时,自定义线程堆栈的大小,这么创建线程会失败。
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-9-26 20:16:50 | 显示全部楼层
回复

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2016-9-27 08:50:31 | 显示全部楼层
#define osThreadDef         (                   name,
                          priority,
                          instances,
                          stacksz
        )                

Define the attributes of a thread functions that can be created by the function osThreadCreate using osThread.

Parameters
    name        name of the thread function.
    priority        initial priority of the thread function.
    instances        number of possible thread instances.
    stacksz        stack size (in bytes) requirements for the thread function.

Note
    CAN BE CHANGED: The parameters to osThreadDef shall be consistent but the macro body is implementation specific in every CMSIS-RTOS.

第三个参数不是设置堆栈大小的
永远保持一颗学习的心态。
回复

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2016-9-27 08:51:22 | 显示全部楼层
你可以把工程传上来,我帮你看看
永远保持一颗学习的心态。
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-9-27 14:48:09 | 显示全部楼层
科科1987 发表于 2016-9-27 08:50
#define osThreadDef         (                   name,
                          priority,
                          instances,

是我写错了,应该是第四个参数,就是最后一个参数。
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-9-27 15:01:13 | 显示全部楼层
科科1987 发表于 2016-9-27 08:51
你可以把工程传上来,我帮你看看

好的谢谢你了。
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-9-27 15:06:25 | 显示全部楼层
科科1987 发表于 2016-9-27 08:51
你可以把工程传上来,我帮你看看

好的,麻烦你了。

threadCreate.rar

2.85 MB, 下载次数: 117

创建线程失败

回复

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2016-9-27 18:25:06 | 显示全部楼层
你给的工程我打开编译不了,可能是我的keil的pack好久没有更新了

你把这里:Stack_Size      EQU     0x00000400
改大一些试试。

永远保持一颗学习的心态。
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-9-27 22:55:23 来自手机 | 显示全部楼层
科科1987 发表于 2016-9-27 18:25
你给的工程我打开编译不了,可能是我的keil的pack好久没有更新了

你把这里:Stack_Size      EQU     0x ...

应该不是这的问题,之前试过了。没事儿,我再弄弄
回复

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2016-9-28 07:54:49 | 显示全部楼层
moxigua 发表于 2016-9-27 22:55
应该不是这的问题,之前试过了。没事儿,我再弄弄

osThreadDef(mmThread,osPriorityNormal,2,496);改成osThreadDef(mmThread,osPriorityNormal,0,128);试试
永远保持一颗学习的心态。
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-9-28 14:39:54 | 显示全部楼层
科科1987 发表于 2016-9-28 07:54
osThreadDef(mmThread,osPriorityNormal,2,496);改成osThreadDef(mmThread,osPriorityNormal,0,128);试试

刚才试了,还是不行。
我感觉本身系统的问题的可能性比较大,STM32F10x好像只能使用CMSIS_RTOS V1,手上没有F4的板子,所以没有试CMSIS_RTOS V2。如果你手上有F4可以试试。
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-9-28 20:32:35 | 显示全部楼层
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-9-28 20:33:02 | 显示全部楼层
有没有谁,解决这个问题了????
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-10-1 18:54:15 | 显示全部楼层
科科1987 发表于 2016-9-26 19:58
如果自己定义了任务堆栈大小,创建任务时要从os_stack_mem里分配任务堆栈大小,见下:
/// Create a thr ...

感谢 科科兄弟 的耐心的讲解和帮助!!我前几天有事没有上论坛,看了你的回答虽然还没有验证,但是我感觉问题应该就是出现在这!!!
再次感谢 科科。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 18:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表