免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5175 | 回复: 17
打印 上一主题 下一主题

请问,有人在学习研究RTOS-uC/OS-II吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-14 18:22 |只看该作者 |倒序浏览
作为开源的实时嵌入式OS,uC/OS-II在嵌入式应用领域挺多的。可是我发现嵌入式论坛里没有人提及这个系统,不知道有人在学习这个没?如果有,大家可以交流一下l

另外,有个小建议:嵌入式开发这个版块能不能根据嵌入式OS进行细化,毕竟嵌入式OS的主流还是不止一类的。

顺便附上一个uC/OS-II的官方网站:http://www.micrium.com/

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2008-09-14 18:36 |只看该作者
呵呵,这是我学习OS的入门操作系统,基本上所有代码都看过,希望一起交流

论坛徽章:
0
3 [报告]
发表于 2008-09-14 23:44 |只看该作者
楼上的哥们,你把这个系统的那些底层关系都缕顺了没有,很多东西看得我很头大呀

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2008-09-15 09:04 |只看该作者
原帖由 kingink1983 于 2008-9-14 23:44 发表
楼上的哥们,你把这个系统的那些底层关系都缕顺了没有,很多东西看得我很头大呀


呵呵,我也说不好,不过你没搞明白的可以贴出来,这个OS我差不多搞了一年,短小精干的OS,还是挺不错的。

论坛徽章:
0
5 [报告]
发表于 2008-09-16 11:07 |只看该作者
原帖由 dreamice 于 2008-9-14 18:36 发表
呵呵,这是我学习OS的入门操作系统,基本上所有代码都看过,希望一起交流

INT8U  const  OSUnMapTbl[] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */
};

能帮忙告诉这个表示如何建立的嘛? 作者也没说他的构造思路

另外:在os——mem.c文件的OSMemCreate(……)函数中:
OS_MEM  *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
    OS_CPU_SR  cpu_sr;
#endif   
    OS_MEM    *pmem;
    INT8U     *pblk;
    void     **plink;
    INT32U     i;


#if OS_ARG_CHK_EN > 0
    if (addr == (void *)0) {                          /* Must pass a valid address for the memory part. */
        *err = OS_MEM_INVALID_ADDR;
        return ((OS_MEM *)0);
    }
    if (nblks < 2) {                                  /* Must have at least 2 blocks per partition      */
        *err = OS_MEM_INVALID_BLKS;
        return ((OS_MEM *)0);
    }
    if (blksize < sizeof(void *)) {                   /* Must contain space for at least a pointer      */
        *err = OS_MEM_INVALID_SIZE;
        return ((OS_MEM *)0);
    }
#endif
    OS_ENTER_CRITICAL();
    pmem = OSMemFreeList;                             /* Get next free memory partition                */
    if (OSMemFreeList != (OS_MEM *)0) {               /* See if pool of free partitions was empty      */
        OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;
    }
    OS_EXIT_CRITICAL();
    if (pmem == (OS_MEM *)0) {                        /* See if we have a memory partition             */
        *err = OS_MEM_INVALID_PART;
        return ((OS_MEM *)0);
    }
    plink = (void **)addr;                            /* Create linked list of free memory blocks      */
    pblk  = (INT8U *)addr + blksize;
    for (i = 0; i < (nblks - 1); i++) {
        *plink = (void *)pblk;
        plink  = (void **)pblk;
        pblk   = pblk + blksize;
    }
    *plink              = (void *)0;                  /* Last memory block points to NULL              */
    pmem->OSMemAddr     = addr;                       /* Store start address of memory partition       */
    pmem->OSMemFreeList = addr;                       /* Initialize pointer to pool of free blocks     */
    pmem->OSMemNFree    = nblks;                      /* Store number of free blocks in MCB            */
    pmem->OSMemNBlks    = nblks;
    pmem->OSMemBlkSize  = blksize;                    /* Store block size of each memory blocks        */
    *err                = OS_NO_ERR;
    return (pmem);
}
/*$PAGE*/

其中的pblk  = (INT8U *)addr + blksize;这个转化,不会造成地址截断嘛,毕竟addr所占的空间不止一个字节吧


[ 本帖最后由 kingink1983 于 2008-9-16 11:08 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-09-16 12:38 |只看该作者
osek的干活。。。。。。

论坛徽章:
0
7 [报告]
发表于 2008-09-16 13:23 |只看该作者
原帖由 kingink1983 于 2008-9-14 18:22 发表
作为开源的实时嵌入式OS,uC/OS-II在嵌入式应用领域挺多的。可是我发现嵌入式论坛里没有人提及这个系统,不知道有人在学习这个没?如果有,大家可以交流一下l

另外,有个小建议:嵌入式开发这个版块能不能根 ...


哈哈,
你所在的板块是
首页 &raquo; CU论坛 &raquo; Linux &raquo; 汇总贴列表 &raquo; 嵌入式开发 &raquo;

论坛徽章:
0
8 [报告]
发表于 2008-09-16 13:34 |只看该作者
我觉得应该开个实时嵌入式操作系统的板块

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
9 [报告]
发表于 2008-09-16 14:01 |只看该作者

回复 #5 kingink1983 的帖子

我简单说一下关于这个表的作用及构造算法(一次面试中被问到,惭愧没答出来 )。
作用:找出优先级最低位为1的位置。大家知道,优先级越高,其数值越小,所以,在这里也即找出优先级最高的位置。
算法:
(1)对于一个8位数,如果是奇数,那么最低位必为1,如00000001(十进制1),00000101(十进制5)……,所以,我们只需要计算偶数位即可;
(2)算出0——256中的偶数最低位为1的位置;(该算法也主要是这么一个实现了)
我把这个算法的c代码贴在下面:

  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int OSUnMapTbl[256];
  5.         int i, j, k;
  6.         for(i = 0; i < 256; i ++) // initialize var
  7.         OSUnMapTbl[i]=0;
  8.         for(i = 2; i < 256; i += 2) // only calculate even numbers
  9.         {
  10.                 j = i;
  11.                 k = 0;
  12.                 do
  13.                 {
  14.                         j = j >> 1;
  15.                         k++;
  16.                 }while(j % 2 == 0);
  17.                 OSUnMapTbl[i] = k;
  18.         }
  19.         for(i = 1; i < 257; i ++) // print the result
  20.         {
  21.                 printf("%d,", OSUnMapTbl[i-1]);
  22.                 if(i % 16 == 0)
  23.                         printf("\n");
  24.         }
  25.         getchar(); // pause
  26.         return 0;
  27. }
复制代码

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
10 [报告]
发表于 2008-09-16 14:07 |只看该作者
其中的pblk  = (INT8U *)addr + blksize;这个转化,不会造成地址截断嘛,毕竟addr所占的空间不止一个字节吧

我不知道你所说的地址截断是什么意思,这里把addr转换成无符号字符型的,然后加上blksize,意即pblk指向了addr+blksize的位置,addr只是一个指针,况且指针在不同的系统中所占的地址是不确定的32位系统是4个字节,有些8位系统是三个字节。所以,我觉得和这个所谓的截断没有什么关系。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP