prife
prife
This guy hasn't written anything yet

注册于 10 years ago

回答
0
文章
0
关注者
0

貌似不行,这样切换的上下文都不对了。

对bsp的代码不熟,又涉及两个文件,等酱油哥吧


有个新的想法,利用windows的signal。

void rt_thread_swtich_to()
{

WinThreadScheduler()
}

WinThreadScheduler()
{

setjmp() //在这里保存jmp点
for(;;)
{
....
}
}

还是利用www20的实现的多纤程技术。但是保留定时器线程(循环wait定时器产生的event),然后发送signal,在signal的handler里longjmp到上面setjmp保存的点去。

原来首楼的dumphex实现,原来实现的较冗长,为了使大家关注重点,将其移动至本楼


void dumphex(uint8_t* buf, int32_t len)
{
static char membuf[1024];
uint8_t *ptr = (uint8_t *)buf;
char * ibuf = membuf;
int32_t i, j;
int len1, len2;

len1 = len / 16 * 16;
len2 = len % 16;
ibuf[0]=0;

#define BIN2CHAR(ch) (((ch) > ' ' && (ch) <= '~') ? (ch) : '.')

for (i=0; i {
sprintf(ibuf, "%04x ", i);
ibuf += 6;
for (j=0; j<16; j++)
{
sprintf(ibuf, "%02x ", ptr[j]);
ibuf += 3;
}
sprintf(ibuf, " ");
ibuf += 2;
for (j=0; j<16; j++)
{
sprintf(ibuf, "%c", BIN2CHAR(ptr[j]));
ibuf ++;
}
sprintf(ibuf, "
");
ibuf ++;
ptr += 16;
}

if (len2 == 0)
goto __print;

sprintf(ibuf, "%04x ",((len >> 4) << 4));
ibuf += 6;
for (i=0; i {
sprintf(ibuf, "%02x ", ptr
    );
    ibuf += 3;
    }
    for (i=len2; i<16; i++)
    {
    sprintf(ibuf, " ");
    ibuf += 3;
    }
    sprintf(ibuf, " ");
    ibuf += 2;
    for (i=0; i {
    sprintf(ibuf, "%c", BIN2CHAR(ptr
      ));
      ibuf += 1;
      }

      sprintf(ibuf, "
      ");

      __print:
      printf("%s", membuf);
      }

粗看了下代码。逻辑上没发现啥严重问题。
请问楼主,你的问题是否是:
dfs_umount之后再重新dfs_mount挂载,每次都会失败?
楼主需要先验证这个问题,可以通过在finsh中手动执行umount以及mount的方式测试。

打开一个文件,最多只支持8位的文件名,怎么增加文件的名字到十位?


看新版编程手册 12.6节。
http://www.rt-thread.org/download/manua ... ual.zh.pdf

1. 现在逐步把接口统一到console device;所以finsh shell初始化时会去获取console device;
2. 有IIC接口;
3. 可以编写IIC控制器驱动,而不是使用GPIO。具体,得看代码 -_-


I2C的接口具体是哪个,我在1.1.1的代码中看到一个rt_i2c_bus_device_register,不过只有rt_i2c_bit_add_bus
调用了这个接口,而这个只在AT91上实现了一个GPIO的I2C驱动,是不是其它平台都要自己去写,目前系统中并没有
提示实现?另外SPI接口呢?

网站上的最新手册是不是针对1.2的?我看有些接口似乎和代码中有些差异。


是针对1.2的。不过较多内容是从旧文档修改而来,可能存在疏漏。如果看到请指出来。会尽快改掉的。

通过修改参数 使用串口3,但是就是没数据输出来,是硬件仿真的,请问这是什么问题啊?


你没有修改对。

不太现实。技术多样性的存在就是针对各种不同情况的解决方案。

了解,去尝试下,已经用GITHUB最新版本了。。。看看msh是什么东东。。。


msh是finsh的一个选项。在rtconfig.h中添加下面两个宏就可以把finsh编程类似bash的风格了。
FINSH_USING_MSH

FINSH_USING_MSH_DEFAULT

如果用arm gcc的话,可以用arm-none-eabi-gcc。
一般情况下,如果出现bsp使用gcc编译崩溃而mdk编译不崩溃的话,这一般属于代码中存在隐蔽的bug,这种情况我遇到过。上一楼代码提供裁剪过得bsp使用gcc来编译也是可以的。在公司的时候没安装gcc toolchain也没有板子,因此就没有测试。

重新开一楼。这里提供一个裁剪好的stm32f10x c8的工程。为了测试方便,我打开了CONSOLE支持,这样就可以用使用rt_kprintf了。但是需要打开 heap支持和mempool支持,这导致系统占用的资源膨胀到15K左右。(开O3优化后,可以降低到15K左右)。

另外:这个bsp是对wiki中裁剪rt-thread页面实例工程的修改。而新的1.2.0中的stm32f10x bsp串口使用了新的框架。注意区别。


** Object/Image Component Sizes
Code (inc. data) RO Data RW Data ZI Data Debug Object Name

17746 4922 2038 304 2760 384327 rtthread-stm32.axf (uncompressed)
17746 4922 2038 96 2760 384327 rtthread-stm32.axf (compressed)
17746 4922 2038 96 0 0 ROM Totals for rtthread-stm32.axf
scons: done building targets.


下载附件[stm32f10x_mini.7z]

再强调几点:
1. 一定要根据自己板子的情况修改board.h中的内存大小。
2. 如果修改了rtconfig.h中的调度器优先级别,stm32平台默认是32,如果改成了8,那么就要保证创建线程的时候,优先级参数不能超过最大优先级别,否则系统会崩溃。附件代码里我改成8优先级,因此led线程的优先级写的是5..(这是原裁剪工程里还是20,所以是有坑的)
3. 进一步裁剪,可以关闭rt_kprintf支持,这样的话,可以在rtconfig.h中关闭
heap
mempool
console
这样可以极大减少flash占用。

看了下application.c代码,都被你搞成什么了啊。好几处for();;
还有,各种C99式变量定义。不建议那样写。

代码我小改了一下。包括:

1. 主要是删掉你在application.c里的for();;
2. 修改rtconfig.py中的编译器为keil
3. 我记得你好像说你用103vb?这个板子偏内flash是20K的。board.h里你已经把RAM改成20K了。

编译运行:
下载附件代码
如果使用MDK编译器,

scons --target=mdk4 -s
重新生成工程。(需要添加RTT_ROOT环境变量)
然后按照下图配置MDK,用自带的simulator仿真了一下,可以正确运行。目测在板子上也能直接运行。
[attachment=-4]
[attachment=-3]
[attachment=-2]

修改后的bsp [attachment=-1]

最后,我记得你好像在邮件列表里说希望裁剪bsp大小? 可以参考wiki上那篇文章来裁剪。方法都是一样的

-----------------------------------------------------------------
追加:

wiki上的那篇裁剪文档还算OK,但是提供的那个实例工程有很多问题。(那什么,那个帖子我写的,工程也是我提供的,坑了大家了,对不住了,今晚就那个页面中的实例工程包)

而且发现1.2.0RC版的UFFS不能同时挂载两个Nand分区,请教?


可以同时挂两个,不过驱动里需要写好。怀疑驱动写的有问题。至于识别扇区为坏快,应该是驱动使用的spare区(或oob区)与uffs配置的坏块字节不同。你可能需要该一下dfs_uffs.c里的代码,我默认好像是用的spare区第4个字节。

回到
顶部

发布
问题

投诉
建议