这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » 在uTenux工程中使用printf(非microlib)

共3条 1/1 1 跳转至

在uTenux工程中使用printf(非microlib)

高工
2013-07-02 13:33:07     打赏

PS:遗留问题已解决

uTenux工程中使用printf(非microlib

前段时间说过过microlib的事情,那时在百度上找到的答案是使用microlib来解决。但是由于microlib的效率和不确定性,uTenux中没有使用这个东西。因此那种使用printf的方法也就不能用了。

今天看英倍特的一个例子,偶然间发现它也在用printf,看了一下没有使用microlib

于是照葫芦画瓢,也在工程里边加上了printf的功能。下面是步骤:

1、编辑分散加载描述文件:kernel-rom.sct。最后的效果是这样的:

         LOAD_INTERFLASHROM 0x08000000 0x00100000  {      ; load region size_region

  EXEC_INTERROM    0x08000000 0x00100000  {      ; load address = execution address

   * (.vector,+First)                            ;                           1024k

   *(InRoot$$Sections)

   .ANY (+RO)

  }

  EXEC_VECTORRAM   0x20000000 0x00000400  {      ; vector table region in ram

  }                                              ;                             1k

  EXEC_BSSDATARAM  0x20000400 0x00001c00  {      ; zi and rw data region in ram

   .ANY (+RW +ZI)

  }                                              ;                             7k

  EXEC_SYSTEMRAM   0x20002000 0x00019000  {      ; ut/kernel management region

  }                                              ;                            100k

  EXEC_USERRAM     0x2001b000 0x00001000  {      ; user manual region in ram

  }                                              ;                             4k

  EXEC_STACKRAM    0x2001c000 0x00000000  {      ; default stack top

  }                                              ;                             0k

         ARM_LIB_HEAP 0x20007000 EMPTY 0x400

    {

    }

 

    ARM_LIB_STACK 0x20007FFC EMPTY -0x400

    {

    }

}                                                ;                    

参考百度的结果。我增加了两行,ARM_LIB_HEAP 0x20007000 EMPTY 0x400ARM_LIB_STACK 0x20007FFC EMPTY -0x400

如果不加,就会报链接错误:armlink Error: L6915E

参考在这里:http://blog.sina.com.cn/s/blog_5c4dd3330100s3yk.html

我不了解sct文件的写法,只是简单的复制了一下。

2、从写printf的实现函数fputc,这是老方法了,一直用。

//重定义printf

int fputc(int ch,FILE *f)

{

  //检查发送寄存器为空之后再往里边放数据

  while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)

  {}

  //USART发送一个字符

  USART_SendData(USART3, (uint8_t) ch);

  return ch;

}

 

3、使用printf,正常用,没啥差别。




关键词: uTenux     printf    

高工
2013-07-02 13:48:32     打赏
2楼

遗留问题:

    ARM_LIB_HEAP 0x20007000 EMPTY 0x400

    {

    }

    ARM_LIB_STACK 0x20007FFC EMPTY -0x400

    {

    }

加入这两个区域的描述之后,虽然能接受发送,但使用原来的tm_putstring时候,程序会跑飞。

跟踪进去,发现多数是在__set_PRIMASK( 0x1 );和__set_PRIMASK( imask );跑飞。单步运行就没问题,F5连续执行就不行了


应该是我定义的区域不对,改改这两个东西的位置就能好,谁来帮个忙啊!

这两个东西的定义跟EXEC_SYSTEMRAM 有重叠。怎样改改啊?

EXEC_SYSTEMRAM   0x20002000 0x00019000  {      ; ut/kernel management region
  }

解决方法,这不是sct的问题。

首先,因为我不懂sct文件写法,所有已有问题就往这里推。这是不对的。

因为昨天做中断实验,把串口中断打开了。导致今天用原来的tm_getchar跑飞
原来还不是sct的问题。是个低级弱智型问题

关掉串口的那个中断,一切正常。。。

完全正常


院士
2013-07-10 11:21:54     打赏
3楼
记录一下,以后这个问题不能发生在我的身上

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]