打印

请教:7对应5,5对应4,8对应2,如何实现类似的数字映射?

[复制链接]
1702|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MCUJunior|  楼主 | 2008-9-22 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "config.h"

uint8 a = 7;
uint8 b = 3;
uint8 c = 0;
    
uint8 d = 5; 
uint8 e = 4;
uint8 x = 0;
 
uint8 s = 0; 
uint8 j = 0;


void CreateMacro(uint8 i,uint8 s) 
{
       j = s;
       #define f(i)      j
       
}

int main (void)
{
   
       
    CreateMacro(a, b);
    CreateMacro(d, e);
    
    c = f(7);
    x = f(5);
    
    while (1);
    return 0;
}
 
  上面是我写的程序,不加全局变量j会提示找不到第二个参数s(下面那个函数中的s)。就像这样定义
void CreateMacro(uint8 i,uint8 s) 
{
       #define f(i)      s      
}
  但是仿真的结果c和x都等于4.但是宏定义函数运行两次应该是
#define f(7)  5
#define f(5)  4
  但实际运行后可能认为宏f就是得到4?我以前看过uboot,lwip有类似在函数中定义宏的操作,这里为了提高效率,省内存,用了这种方法,不过得不到结果。哪里不正确呢?这应该是带参数的宏吧,请各位指点。
   或者还有什么方法可以实现我说的这种映射,7-->5,5-->4,类似的映射,就是一个数字映射到另一个数字?函数switch比较慢,查找表太耗内存,我想不到别的方法,但是宏定义又搞不定,请指教。谢谢。

相关帖子

沙发
lbx_00| | 2008-9-22 11:30 | 只看该作者

查表是最快的,你的程序存储器难道很小吗

使用特权

评论回复
板凳
computer00| | 2008-9-22 11:34 | 只看该作者

少量可以用switch或者if语句

swith(s)
{
 case 7: return 5;
 case 5: return 4;
 case 8: return 2;
 default: return 0;
}

使用特权

评论回复
地板
MCUJunior|  楼主 | 2008-9-22 11:34 | 只看该作者

re:谢谢楼上

   没有具体的东西,针对小型ARM的OS。这是其中的一个设计细节,所以要尽可能减小RAM,这个也没法固化在flash中,动态改变的,跟flash无关。

使用特权

评论回复
5
MCUJunior|  楼主 | 2008-9-22 12:04 | 只看该作者

圈圈行动好快

  呵呵

使用特权

评论回复
6
平常人| | 2008-9-22 14:01 | 只看该作者

宏定义是静态的,只在编译阶段处理,程序运行时宏已经被

楼主的概念错了!

可以试验这个方法:

#define f(x,y)  { if (x==7) y=5;
  else if (x==5) y=4;
  else if (x==8) y=2; else y=0; }

使用时这样调用:
  f(7,c);
  f(5, x);

这里因为上述输入的虚拟参数x始终是常数,宏定义f(x,y)中的if else语句会在编译阶段被优化掉,除非你的编译器不够好。

使用特权

评论回复
7
MCUJunior|  楼主 | 2008-9-22 14:23 | 只看该作者

我说的太模糊

   其实我这个是给ucos加时间片中用到的,因为同一优先级支持多个任务,所以常规方法应该是使用链表来等待事件,在事件的数据结构中添加链表头尾。但是这样的实现操作起来比较慢,要么是按先入先出的顺序来实现取事件,要么是按优先级顺序来取事件。前者将ucos任务优先级的概念给抹杀了,后者应该是在pend函数时做冒泡法一类的排序,才能post时直接取链表头的任务,但是在pend时做工作比较多,关中断比较长。
   (补充:同一优先级任务用循环双向链表链接。)
   我想的方法是仍然使用查表法,这样很快,但是有个问题是吃RAM很厉害,因为常规方法是每一个事件都要设置优先级个数个指针(OSLowestPrio),这样小ARM会很累,毕竟不是光跑OS,还有USB,TCP需要考虑。实际中每一个事件可能只有若干个优先级的任务在等待,就没有必要那么多优先级的指针,假设某个事件Ea有4个优先级任务在等待,只要用内存部分函数开4个4字节的指针来存储就可以了,但是这就出现一个问题,你怎么把任务优先级和4个指针联系起来,把4个指针以数组的索引来看,(当然可能有内存不连续的问题,如果是按需要来开内存块)。就需要一一映射。举个例子,比如优先级是7的任务申请这个事件,就得把优先级为7的任务指针放到索引3的地方,prio为5的任务又申请,就放到索引为4的地方。但是怎么知道优先级为7的任务对应的索引呢?就是我的上面的问题了。使用查找表会吃内存,因为每个事件都得来个查找表,使用类似switch会效率慢,平常人前辈的方法,我还没太看明白,貌似和我想的不太一样,主要是我说的不清楚。
   还是谢谢平常人前辈以及楼上各位。
   还请各位前辈指点。谢谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

178

帖子

0

粉丝