BruceTan
BruceTan
这家伙很懒,什么也没写!

注册于 5年前

回答
31
文章
5
关注者
4

发布于6月前

你可以分成两个时间,一个事件1给线程A用,一个事件2给线程B用

发布于11月前

博主解决了吗,我也遇到了同样的问题,出现这个问题的时候,线程都是不会运行的

screenshot_image.png

发布于2年前

我这边遇到同样的情况,把shell的线程栈开大到2048以后,ping就正常了,因为ping的时候,需要使用网络,如果线程栈太小就会导致hardfault

发布于2年前

我用ulog的时候也觉得定位问题不好找位置,每次都要全局搜索,才知道程序死在哪,建议加上文件名和行号,用户用不用是他自己的事,但是不能没有

发布于2年前

把main线程栈开大一些

发布于2年前

内置

发布于2年前

我也遇到一样的问题,现在试试1.3.5的版本试试看

发布于2年前

我也遇到同样的问题,加了DMA没有改善

发布于2年前

看错误信息,应该是你没有打开设备虚拟文件系统devfs,所以你的系统上没有/dev/%s这个文件
所以解决办法就是,打开menuconfig把devfs打开

发布于2年前

可以看看这段代码,DMA+IDLE接收串口数据

  1. /*
  2. * 程序清单:这是一个串口设备 DMA 接收使用例程
  3. * 例程导出了 uart_dma_sample 命令到控制终端
  4. * 命令调用格式:uart_dma_sample uart3
  5. * 命令解释:命令第二个参数是要使用的串口设备名称,为空则使用默认的串口设备
  6. * 程序功能:通过串口输出字符串"hello RT-Thread!",并通过串口输出接收到的数据,然后打印接收到的数据。
  7. */
  8. #include <rtthread.h>
  9. #define SAMPLE_UART_NAME "uart3" /* 串口设备名称 */
  10. /* 串口接收消息结构*/
  11. struct rx_msg
  12. {
  13. rt_device_t dev;
  14. rt_size_t size;
  15. };
  16. /* 串口设备句柄 */
  17. static rt_device_t serial;
  18. /* 消息队列控制块 */
  19. static struct rt_messagequeue rx_mq;
  20. /* 接收数据回调函数 */
  21. static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
  22. {
  23. struct rx_msg msg;
  24. rt_err_t result;
  25. msg.dev = dev;
  26. msg.size = size;
  27. result = rt_mq_send(&rx_mq, &msg, sizeof(msg));
  28. if ( result == -RT_EFULL)
  29. {
  30. /* 消息队列满 */
  31. rt_kprintf("message queue full!\n");
  32. }
  33. return result;
  34. }
  35. static void serial_thread_entry(void *parameter)
  36. {
  37. struct rx_msg msg;
  38. rt_err_t result;
  39. rt_uint32_t rx_length;
  40. static char rx_buffer[RT_SERIAL_RB_BUFSZ + 1];
  41. while (1)
  42. {
  43. rt_memset(&msg, 0, sizeof(msg));
  44. /* 从消息队列中读取消息*/
  45. result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER);
  46. if (result == RT_EOK)
  47. {
  48. /* 从串口读取数据*/
  49. rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size);
  50. rx_buffer[rx_length] = '\0';
  51. /* 通过串口设备 serial 输出读取到的消息 */
  52. rt_device_write(serial, 0, rx_buffer, rx_length);
  53. /* 打印数据 */
  54. rt_kprintf("%s\n",rx_buffer);
  55. }
  56. }
  57. }
  58. static int uart_dma_sample(int argc, char *argv[])
  59. {
  60. rt_err_t ret = RT_EOK;
  61. char uart_name[RT_NAME_MAX];
  62. static char msg_pool[256];
  63. char str[] = "hello RT-Thread!\r\n";
  64. if (argc == 2)
  65. {
  66. rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
  67. }
  68. else
  69. {
  70. rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
  71. }
  72. /* 查找串口设备 */
  73. serial = rt_device_find(uart_name);
  74. if (!serial)
  75. {
  76. rt_kprintf("find %s failed!\n", uart_name);
  77. return RT_ERROR;
  78. }
  79. /* 初始化消息队列 */
  80. rt_mq_init(&rx_mq, "rx_mq",
  81. msg_pool, /* 存放消息的缓冲区 */
  82. sizeof(struct rx_msg), /* 一条消息的最大长度 */
  83. sizeof(msg_pool), /* 存放消息的缓冲区大小 */
  84. RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */
  85. /* 以 DMA 接收及轮询发送方式打开串口设备 */
  86. rt_device_open(serial, RT_DEVICE_FLAG_DMA_RX);
  87. /* 设置接收回调函数 */
  88. rt_device_set_rx_indicate(serial, uart_input);
  89. /* 发送字符串 */
  90. rt_device_write(serial, 0, str, (sizeof(str) - 1));
  91. /* 创建 serial 线程 */
  92. rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
  93. /* 创建成功则启动线程 */
  94. if (thread != RT_NULL)
  95. {
  96. rt_thread_startup(thread);
  97. }
  98. else
  99. {
  100. ret = RT_ERROR;
  101. }
  102. return ret;
  103. }
  104. /* 导出到 msh 命令列表中 */
  105. MSH_CMD_EXPORT(uart_dma_sample, uart device dma sample);

发布于2年前

发布于2年前

这。。。。我找到原因了,需要调用一个ulog_ef_filter_cfg_load函数,因为进去看了ulog_init这个函数,函数里面会设置ulog_global_filter_lvl_set(LOG_FILTER_LVL_ALL);,LOG_FILTER_LVL_ALL是等于7的,也就是调试级别,所以每次上电都会恢复,而在main函数中调用一下ulog_ef_filter_cfg_load,就会把Flash中保存的等级赋值到ulog上,就会生效了。

  1. int main(void)
  2. {
  3. fal_init();
  4. easyflash_init();
  5. ulog_ef_filter_cfg_load();
  6. set_boot_count();
  7. while (1)
  8. {
  9. rt_thread_mdelay(10);
  10. }
  11. }

发布于2年前

这个可以自己写的,就是几个初始化、读、写、擦除、几个简单的函数

发布于2年前

1.png
2.png
3.png

发布于2年前

我猜大概率是你在调度器开启之前调用了rt_thread_mdelay函数,可以把初始化的代码放到main线程去,这时候调度器打开了,在使用mdelay函数就没问题了

回到
顶部

发布
问题

投诉
建议