2019-12-27 19:01发布
wuzhujian 发表于 2015-8-19 16:59 2楼的,还是仔细看过源码的。
macaroni 发表于 2015-8-20 10:26 非常感谢 1,既然有传递必然有使用,这个我再看看代码。
macaroni 发表于 2015-8-20 11:11 rtx内核函数主要有2种, 用户态使用的(os_前缀)都是用svc软中断发起的,看看svc汇编码就知道svc先检查是 ...
最多设置5个标签!
在吴前辈面前班门弄斧了。。。大师莫怪罪啊嘿嘿
当时没少得到你的帮助啊。。。
rtx内核函数主要有2种,
用户态使用的(os_前缀)都是用svc软中断发起的,看看svc汇编码就知道svc先检查是否为用户svc函数,是的话直接运行用户svc函数(用户svc函数需要先定义函数体,再svc.s中声明函数名)后直接退出,否则就会先运行内核函数之后才进行必要的内核调度啊这些操作。
我见吴大师多次提到过使用内核调用效率并不高,好像这种说法在Windows或者linux上大家都这么说,开销比较大。。。不知道win32api现在是不是还是用内核调用的方法,
还有一种就是中断例程中使用的(isr_前缀),会将此次内核调用注册到一个叫做osfifo的队列里,然后悬起pendsv中断,在那里真正进行内核函数的操作。
3.开销大是和普通的函数调用比较的,因为使用svc软中断,中断进出需要现场保护,进了中断还要判断调用条件,从栈或者sp取地址,用户栈倒腾输入和返回参数
4.你使用的是cmsis-rtx,这个os会在进main之前就初始化了os,所以main其实就是个任务了,,,我对cmsis-rtx并不熟悉,只有这么多了
已解决
- _declare_box8 (mp_stk, OS_STKSIZE*4, OS_TASK_CNT-OS_PRIV_CNT+1); // 通用STACK
- #define _declare_box8(pool,size,cnt) U64 pool[(((size)+7)/8)*(cnt) + 2]
- uint64_t os_stack_mem[2+OS_PRIV_CNT+(OS_STACK_SZ/8)]; // 私有STACK
- #define OS_STACK_SZ (4*(OS_PRIVSTKSIZE+OS_MAINSTKSIZE+OS_TIMERSTKSZ))
复制代码如上,RTX定义了两组STACK,一组是“通用”STACK,一组是私有“STACK”。这个私有STACK是不是有BUG???
如果按照我的理解 应该这样定义:
- uint64_t os_stack_mem[2+(OS_STACK_SZ/8)];
- #define OS_STACK_SZ (4*(OS_PRIVSTKSIZE * OS_PRIV_CNT +OS_MAINSTKSIZE+OS_TIMERSTKSZ))
复制代码其中OS_MAINSTKSIZE应该是给main线程,OS_TIMERSTKSZ应该是给定时器线程,这两个应该使用的是“私有”STACK。
还是说RTX有什么黑科技?
OS_PRIVSTKSIZE 并不是定义的每个“私有”STACK的堆栈数目,而是所有“私有”STACK的堆栈数目。
- // <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 0 // this stack size value is in words
- #endif
复制代码有深度的好帖子,,感谢楼主!!
一周热门 更多>