Cold
Cold
This guy hasn't written anything yet

注册于 3 years ago

回答
4
文章
0
关注者
0

软件包里有的,我也在搞这个,目前Lwip,romfs,webnet这些都移植好了,但有个问题,怎么把index.html、index.shtml、version.asp这几个文件放到romfs.c中呢?有什么工具可以转换吗?

这个webnet的的包在哪里??怎么找不到呢?

goahead的处理方式感觉很好啊

这个动态的网页做的很赞啊!如果想把网页html放到单片机里有什么好的建议没?目前觉得最好的是
rom.c和webcomp.c(页面rom处理程序),webcomp这个有了解吗?

使用rt_malloc分配的空间在哪里应该是是初始化的时候指定的吧,rt_system_heap_init这个指定的地址就是rt_malloc时分配的空间吧

补充上来:
在不同的 CPU 架构里,线程之间的上下文切换和中断到线程的上下文切换,上下文的寄存器部分可能是有差异的,也可能是一样的。在 Cortex-M 里面上下文切换都是统一使用 PendSV 异常来完成,切换部分并没有差异。但是为了能适应不同的 CPU 架构,RT-Thread 的 libcpu 抽象层还是需要实现三个线程切换相关的函数:

1) rt_hw_context_switch_to():没有来源线程,切换到目标线程,在调度器启动第一个线程的时候被调用。

2) rt_hw_context_switch():在线程环境下,从当前线程切换到目标线程。

3) rt_hw_context_switch_interrupt ():在中断环境下,从当前线程切换到目标线程。

在线程环境下进行切换和在中断环境进行切换是存在差异的。线程环境下,如果调用 rt_hw_context_switch() 函数,那么可以马上进行上下文切换;而在中断环境下,需要等待中断处理函数完成之后才能进行切换。

由于这种差异,在 ARM9 等平台,rt_hw_context_switch() 和 rt_hw_context_switch_interrupt() 的实现并不一样。在中断处理程序里如果触发了线程的调度,调度函数里会调用 rt_hw_context_switch_interrupt() 触发上下文切换。中断处理程序里处理完中断事务之后,中断退出之前,检查 rt_thread_switch_interrupt_flag 变量,如果该变量的值为 1,就根据 rt_interrupt_from_thread 变量和 rt_interrupt_to_thread 变量,完成线程的上下文切换。

在 Cortex-M 处理器架构里,基于自动部分压栈和 PendSV 的特性,上下文切换可以实现地更加简洁。

baili_shanghai 发表于 2020-6-9 14:38
usb advisor,类似这种USB协议分析仪


USB分析仪啊,,,,目前买仪器不太可能。还是先借助软件抓包来分析吧,应该可以找到问题

baili_shanghai 发表于 2020-6-8 19:48
bus hound是驱动或过滤驱动获取的内容。针对ctl没有IN,可能是transfer没有结束;建议你看dp dn上的数据 ...


嗯,不过我用非RTT的usb的驱动库(st自带的 usb库)做的另一套是可以正常传输的,bus houd也能抓到正常的64字节的控制传输的in包。
你的意思是用示波器抓下dp dm上的信号?这个抓出来不太好解析吧

kkwangkk 发表于 2020-6-3 08:47
USB_CTL引脚 我怎么没用到 我只用了USB_DM USB_PM

DP要上拉,作为Device设备,USB2.0全速设备DP上拉,这样Host就能检测到device了

nongxiaoming 发表于 2020-5-26 21:41
上代码看看


你要哪块的代码?怀疑有可能哪边配置有问题呢

    本帖最后由 Cold 于 2020-5-26 20:29 编辑


第一排红色圈起来的,Host获取0x28长度的数据,这个是正确的。

第三排红圈里的是Host获取0x40长度的数据,但没有收到任何数据,device调试确实发了0x40长度的数据。

测试,获取64 bytes,手动改device发送63个字节,实际收到62字节。

最近没时间调,今天看了下。已经可以正常使用了,原因是USB_CTL的管脚的问题,用的drv_gpio的驱动,感觉不好用,直接定义GPIO ABCD。。。不是挺好用的吗,为啥需要get_st_gpio get_st_pin,还能get错了,也是醉了

xb-w 发表于 2020-5-15 00:12
我这边打开查看list_device也是显示没有被打开,是因为open时不能设置为中断模式,只能用DMA_TX 我也不 ...


rt_err_t rt_usb_device_init(void)
{
rt_device_t udc;
udevice_t udevice;
uconfig_t cfg;
ufunction_t func;
rt_list_t *i;
udclass_t udclass;

/* create and startup usb device thread */
rt_usbd_core_init();

/* create a device object */
udevice = rt_usbd_device_new();

udc = rt_device_find(USB_DEVICE_CONTROLLER_NAME);
if(udc == RT_NULL)
{
rt_kprintf("can't find usb device controller %s\n", USB_DEVICE_CONTROLLER_NAME);
return -RT_ERROR;
}

/* set usb controller driver to the device */
rt_usbd_device_set_controller(udevice, (udcd_t)udc);

/* create a configuration object */
cfg = rt_usbd_config_new();

rt_usbd_device_set_os_comp_id_desc(udevice, &usb_comp_id_desc);

for(i = class_list.next; i!= &class_list; i = i->next)
{
/* get a class creater */
udclass = rt_list_entry(i, struct udclass, list);
/* create a function object */
func = udclass->rt_usbd_function_create(udevice);
/* add the function to the configuration */
rt_usbd_config_add_function(cfg, func);
}
/* set device descriptor to the device */
#ifdef RT_USB_DEVICE_COMPOSITE
rt_usbd_device_set_descriptor(udevice, &compsit_desc);
rt_usbd_device_set_string(udevice, ustring);
if(udevice->dcd->device_is_hs)
{
rt_usbd_device_set_qualifier(udevice, &dev_qualifier);
}
#else
rt_usbd_device_set_descriptor(udevice, func->dev_desc);
#endif

/* add the configuration to the device */
rt_usbd_device_add_config(udevice, cfg);

/* initialize usb device controller */
rt_device_init(udc);

/* set default configuration to 1 */
rt_usbd_set_config(udevice, 1);

return RT_EOK;
}

这个函数里只有find init,就没有打开的操作。没找到open这个usbd的操作

回到
顶部

发布
问题

投诉
建议