landings 发表于 2013-3-5 23:54:31

我写了个程序,却直接出错

我用的一个STM32f103RBT6的小板子,试了试RTT
貌似一开始就出错了,我写的任务一个也没有运行。
串口输出的是这样个,全是0,貌似也没有提供任何信息…………
\ | /
- RT -   Thread Operating System
/ | \   1.1.0 build Mar5 2013
2006 - 2012 Copyright by rt-thread team
psr: 0x00000000
pc: 0x00000000
lr: 0x00000000
r12: 0x00000000
r03: 0x00000000
r02: 0x00000000
r01: 0x00000000
r00: 0x00000000
hard fault on thread: (NULL)
threadpristatus      sp   stack size max used   left tickerror
-------- ---- ------- ---------- ---------- ---------- ---------- ---

aozima 发表于 2013-3-6 09:28:22

从给出的信息无法确定问题所在。
1.“我写的任务一个也没有运行”
没写任务时是否正常?

2.所有寄存器都是0,说明还没有人开始使用,单步一般就可以查出来。

landings 发表于 2013-3-6 13:49:27

本帖最后由 landings 于 2013-3-6 13:51 编辑

aozima 发表于 2013-3-6 09:28 static/image/common/back.gif
从给出的信息无法确定问题所在。
1.“我写的任务一个也没有运行”
没写任务时是否正常?


现在我去掉了自己的任务,还是会出错。代码只有这些:int rt_application_init()
{
        rt_thread_t init_thread;

        rt_err_t result;

#if (RT_THREAD_PRIORITY_MAX == 32)
        init_thread = rt_thread_create("init",
                                                                rt_init_thread_entry, RT_NULL,
                                                                2048, 8, 20);
#else
        init_thread = rt_thread_create("init",
                                                                rt_init_thread_entry, RT_NULL,
                                                                2048, 80, 20);
#endif

        if (init_thread != RT_NULL)
                rt_thread_startup(init_thread);

        return 0;
}我单步运行了一次,跟到rtthread_startup()里面的这里:rt_system_heap_init((void*)&Image$RW_IRAM1$ZI$Limit, (void*)STM32_SRAM_END);进去以后,跟到这里:
    /* initialize the end of the heap */
    heap_end      = (struct heap_mem *)&heap_ptr;
    heap_end->magic = HEAP_MAGIC;
    heap_end->used= 1;
    heap_end->next= mem_size_aligned + SIZEOF_STRUCT_MEM;
    heap_end->prev= mem_size_aligned + SIZEOF_STRUCT_MEM;
现在有两种情况:
1. 如果我把唯一的断点打在heap_end->used= 1;之前,它能运行到断点
如果我把断点打在heap_end->next= mem_size_aligned + SIZEOF_STRUCT_MEM;之前,它运行不到断点。程序跑到rt_hw_hard_fault_exception里面了。

2. 当我换个步调,以很慢的速度在rt_system_heap_init中一行一行地运行的时候,居然能不出错地运行完毕,直到finsh>>出现。

3. 如果中途停在了其他的断点上耽误了时间,那么有时候会出错,有时候不会,出错的位置也很多变,不过通常都在rt_system_heap_init里面。

综上所述,貌似问题不在主线程?因为跑到rt_hw_hard_fault_exception里面这种情况的重现性并不好,仿佛跟我调试的步调有关似的,每次出错的位置并不一样。我就疑惑啊。

aozima 发表于 2013-3-6 15:08:25

"使用STM32 103不同容量的单片机的时候",需要修改board.h 中的 STM32_SRAM_SIZE 值

landings 发表于 2013-3-6 15:34:17

aozima 发表于 2013-3-6 15:08 static/image/common/back.gif
"使用STM32 103不同容量的单片机的时候",需要修改board.h 中的 STM32_SRAM_SIZE 值

果然,是这个问题

{:sweat:}

landings 发表于 2013-3-6 16:46:51

本帖最后由 landings 于 2013-3-6 16:48 编辑

aozima 发表于 2013-3-6 15:08 static/image/common/back.gif
"使用STM32 103不同容量的单片机的时候",需要修改board.h 中的 STM32_SRAM_SIZE 值

还有些问题请教,我现在程序成功启动了,但是出现
rtc is not configured
please configure with set_date and set_time
我暂时并不需要用到RTC,怎么关掉它呢?


二是,请问rt_mq_t是否需要初始化?我在控制台看到了(mq != RT_NULL) assert failed at rt_mq_recv:2085

原因是,我是照抄的RT Thread 1.0 PDF说明中,第十章的串口设备操作例程,它里面的rx_mq在声明以后,未见有初始化,导致在rt_mq_recv()中出错。是否是这个原因?不过,串口调试器还是可以看到接收到的字符被重新发送回了。
如果要避免这个错误提示,该怎么做?/*
* 程序清单:串口设备操作例程
*
* 在这个例程中,将启动一个devt线程,然后打开串口1和2
* 当串口1和2有输入时,将读取其中的输入数据然后写入到
* 串口1设备中。
*
*/
#include <rtthread.h>

/* UART接收消息结构*/
struct rx_msg
{
rt_device_t dev;
rt_size_t size;
};
/* 用于接收消息的消息队列*/
static rt_mq_t rx_mq;
/* 接收线程的接收缓冲区*/
static char uart_rx_buffer;

/* 数据到达回调函数*/
rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
struct rx_msg msg;
msg.dev = dev;
msg.size = size;

/* 发送消息到消息队列中*/
rt_mq_send(rx_mq, &msg, sizeof(struct rx_msg));

return RT_EOK;
}

void device_thread_entry(void* parameter)
{
struct rx_msg msg;
int count = 0;
rt_device_t device, write_device;
rt_err_t result = RT_EOK;

/* 查找系统中的串口1设备 */
device = rt_device_find("uart1");
if (device!= RT_NULL)
{
    /* 设置回调函数及打开设备*/
    rt_device_set_rx_indicate(device, uart_input);
    rt_device_open(device, RT_DEVICE_OFLAG_RDWR);
}
/* 设置写设备为uart1设备 */
write_device = device;

/* 查找系统中的串口2设备 */
device= rt_device_find("uart2");
if (device_!= RT_NULL)
{
    /* 设置回调函数及打开设备*/
    rt_device_set_rx_indicate(device, uart_input);
    rt_device_open(device, RT_DEVICE_OFLAG_RDWR);
}

while (1)
{
    /* 从消息队列中读取消息*/
    result = rt_mq_recv(rx_mq, &msg,
      sizeof(struct rx_msg), 50);
    if (result == -RT_ETIMEOUT)
    {
      /* 接收超时*/
      rt_kprintf("timeout count:%d\n", ++count);
    }

    /* 成功收到消息*/
    if (result == RT_EOK)
    {
      rt_uint32_t rx_length;
      rx_length = (sizeof(uart_rx_buffer) - 1) >
msg.size ? msg.size : sizeof(uart_rx_buffer) - 1;

      /* 读取消息*/
      rx_length = rt_device_read(msg.dev, 0,
&uart_rx_buffer, rx_length);
      uart_rx_buffer = '\0';

      /* 写到写设备中*/
      if (write_device != RT_NULL)
      rt_device_write(write_device, 0,
&uart_rx_buffer, rx_length);
    }
}
}

int rt_application_init()
{
/* 创建devt线程*/
rt_thread_t thread = rt_thread_create("devt",
    device_thread_entry, RT_NULL,
    1024, 25, 7);
/* 创建成功则启动线程*/
if (thread_!= RT_NULL)
    rt_thread_startup(&thread);
}
页: [1]
查看完整版本: 我写了个程序,却直接出错