re: Win32 - 如何控制你的线程 Normandy 2009-12-07 15:28
@Nick
见笑了,英语不咋地,多谢兄台提醒 :)
Keep going on with your dream
re: Win32 - 如何控制你的线程 Normandy 2009-12-07 15:22
@wocow3
各线程清理资源并结束自己的时候, 用 WaitForSingleObject() 可保证线程有序的清理资源并退出。
很多情况可引发竞争: 如线程1 欲结束自己, 但仅清理了一半资源,这时发生 context switch, CPU 切换到线程 2, 而线程2 也要清理资源并结束自己,如果清理资源的动作必须保证有序,就会引发竞争。
re: Win32 - 如何控制你的线程 Normandy 2009-11-30 11:21
@wocow3, 唐新发
这里不会引发等待, 因为 WaitForSingleObject 的第二个参数是 0。 另外, 用全局变量作退出标志有一个致命缺点,当两个已上的线程并发读写全局变量的时候, 就会引发竞争,而用 WaitForSingleObject 则是安全的。
re: Win32 - 如何控制你的线程 Normandy 2009-11-30 11:14
@陈梓瀚(vczh)
Good catch, thanks.
Updated the title with "Keep go on with your dream"
re: Win32 RPC 编程(一) Normandy 2008-10-20 10:09
@金中伟
其实没有这么复杂,我是通过 Makefile 编译的, 没有用 IDE。你打开 Visual Studio 2005 Command Prompt 或 Visual Studio 2008 Command Prompt ,然后进到源码目录下 敲一个 nmake 命令, 所有的都会为你自动生成。细节可查看源码目录下的 Makefile 文件。
re: 浅析远程过程调用 RPC Normandy 2008-08-18 10:13
@achilles
将一些过程放在远程是分布式程序的要求,如客户机/服务器模式。相比常规的网络通信程序而言,在用 RPC 时我们只需要关心程序本身的逻辑,就像建本地程序一样,因为 RPC 已经帮你做了网络通信的工作!
如果你还是不能理解, 请下载我上面的远程过程调用示例,将客户程序和服务程序放在两个不同的机器上运行看看。
如果你想了解更多的细节,请看一下 <<Linux 网络编程>> 第十二章,上面的内容更精彩!
re: 浅析远程过程调用 RPC Normandy 2008-08-15 18:40
@achilles
优点是可直接访问远程过程,避免烦琐的打包和解包过程,且不依赖于某种特定的协议
@毛
实际上板子加电启动时,SRAM 从 0x40000000 开始的 4096 字节区域被映射成 从 0x00000000 开始的 4096 字节区域, 手册上有说明
re: Linux 下 socket 编程示例 Normandy 2008-08-07 12:22
@AlexEric
看情况吧,只恐时间精力不够用。参与开源着重解决实际问题,分析 Kernel 源码则强调理解底层,我更喜欢看些底层的东西。
AlexEric 兄若有心得,一定要拿出来分享啊!
re: Linux 下 socket 编程示例 Normandy 2008-08-07 10:46
@AlexEric
兄弟对 TCP/IP 也有兴趣啊,我打算通读 Linux 下的协议栈源码,有机会多切磋啊 :-)
@严植
上面例子是基于查询而非 DMA ,不过应该不难。我想可能是以下的问题:
(1) 超级终端收发数据有问题(看看设置,如波特率等是否正确)
(2) 板子串口有问题(我的经常是这样, 多插几次试试)
(3) UART 设成 DMA 中断方式有误 (请仔细查看手册, 确认相关的控制寄存器是否设置正确)
re: Linux下C++ IDE的选择。 Normandy 2008-08-04 10:41
可用 Emacs
re: 推荐一个文本编辑器 Normandy 2008-08-04 10:36
NTEmacs 很好用, 你可以试试
@xi_liang
Nand Flash 只是存储器,其前 4k 被映射到 SRAM (就是 NOR FLASH) 里,所以小于 4k 的程序运行是没有问题的, 大于 4k 的程序则不行。在执行 ldr pc, =main 之前 bl copy_block_to_sdram 把 Nand Flash 里的代码搬到 SDRAM 里从 0x30000000 处开始的区域了。而 ldr pc, =main 实际上执行的是:
ldr pc, 0x30000000 + main_addr
这实际上是跳到 SDRAM 里的 main 处并执行 main 调用
@宗华
编译 busybox 1.9.2 需要 arm linux 3.3.2 的编译器, 用 3.3.4 的编译器会有问题, 你需要安装 3.3.2 版本来制作根文件系统
re: 用mingw 创建DLL[未登录] Normandy 2008-06-27 10:09
@sinper
呵呵, 多谢指正!
@guest
看了, 内核配置应该没有问题, 可能是根文件系统的问题, 你用 busybox 制作的根文件系统有多大? 你先用 skyeye testsuite 里的根文件系统试试, 看能否启动?
@guest
可能是 "Initial RAM disk (initrd) support" 没有选中,所以根文件系统没能成功加载。检查一下你的内核配置,看看在我这篇博客里用黄色加亮的部分是否被正确配置。或者把你的内核配置文件 .config 发我看看(jbin8164@gmail.com)。
@guest
从上面看不出哪出错了,你的用 skyeye 和 linux 内核版本是多少? 内核如何配置的?
@silence
我的成功了。可能网卡驱动没有加载,请用如下命令确认一下: dmesg | grep -i 'eth'
看看有没有 eth0 或 cs8900 之类的字消息,有的话,请重新在 skyeye 上运行 arm-linux。如果没有,那就考虑一下如何加载 cs8900 这个网卡驱动。
@补考少年
模拟正是为了实践,这样修改了内核可以在 skyeye 上跑跑, 省得老烧板子了
@FAN
从错误信息上也看不出什么问题, 我猜测可能是如下两个原因:
(1) 你的 arm-linux-gcc 3.4.1 有问题
或者
(2) 编译时你用的 arm-linux-gcc 是 3.3.2, 但链接时用的却是 arm-linux-gcc 3.4.1 的库(libgcc.a)
re: Ubuntu 学习笔记 Normandy 2008-03-31 14:33
@niube's son
呵呵, 一定! 很高兴能对大家有点帮助。大家也可把自己用 Ubuntu 时遇到的困难写出来,一起解决嘛 :-)
@wz
你说的有道理,只有 subs 才能影响 CPSR 的 N 标志位, 看来确实是我大意了。谢谢指正,以后多交流啊!
@FAN
我没有试过 #define TXD0_READY 0x4 查了一下手册,上面这样描述, 对于 UTRSTA0[2]:
Set to 1 automatically when the transmit buffer register has
no valid data to transmit and the transmit shift register is
empty.
0 = Not empty
1 = Transmitter (transmit buffer & shifter register) empty
我觉得可以,你可以试试,别忘了把结果告诉我啊 :-)
@FAN
你好,已将代码发到你邮箱,有问题及时讨论。
@含着泪的微笑
1. RXD0 和 TXD0 你并看不到,能连线的只有串口。
2. 电阻上拉,我的理解是拉高电压,使电路更稳定。
3. 仔细阅读板子附带的手册吧,把这个例子在你的板子上先跑起来
@含着泪的微笑
0x05 代表查询模式,实现起来最简单。
@含着泪的微笑
归纳了你的问题,做答如下:
1. 不一定非得用超级终端, 你也可以自己写程序。将 PC 的串口和 ARM 开发板的串口相连后,只要你的程序向 PC 串口发数据, ARM 就能通过连线获得数据。
2. 至于如何标识一个字串结束, 这是一个协议问题,可指定一个数,比如 0x55AA,当收到的两个连续字符是0x55AA时,则停止接收。
3. 可先将数据存到 SDRAM 缓冲区,再写到 Nand Flash。至于如何写 Nand Flash, 可参考 vivi 的源代码,里面有一个向 Nand Flash 写数据的方法。
@含着泪的微笑
这两个函数是如下使用的:
getc() 会从 UART0 读取一个符, 它不管你向 UART0 输入了什么, 只要有数据就读取, 没有数据就等待。
putc() 会向 UART0 输出一个字符, 上位机的软件(如超级终端) 可以显示它输出的是什么
我想你的问题是这样的:
上位机向 ARM 板子上的 UART0 发送了一个串: "hello,2008", ARM 该如何获取到这个串, 是这样吧?
可以这样解决:
char *buf = (char *)0x30010000;
char *p = buf;
char c = getc();
while (c != 0x0d) {
*p++ = c;
c = getc();
}
*p = '\0';
0x0d 指回车, 意思是当接收到回车时,停止读取操作。这时 "hello,2008" 已经存入缓冲区 buf 里, 你可以再对这个 buf 进行操作了。
@FAN
呵呵,谈不上指教,只是早点入门而已, 以后有问题多切磋、交流, 这样大家都能提高的快些!
@wz
呵呵,这个程序在 FS2410 能跑的。不知有何问题? 还请不吝赐教啊!
@葫芦瓜
有两种思路:
(1) 如果你编译后生成三个二进制程序, 可通过sjf2410 分三次将三个文件烧入 Nand Flash的不同位置, 具体请看 sjf2410.exe 的用法。
(2) 如果你编译后只生成一个二进制文件, 即把 boot 、main 、apply 三个目标文件连接成一个文件,可通过sjf2410 一次烧写即可。要点是在连接时指定连接脚本。 连接脚本如下:
SECTIONS {
first 0x00000000 : { boot.o}
second 0x00000000 : AT(4096) { main.o }
third 0x00000000 : AT(8192) { apply.o }
}
然后在连接程序中这样调用连接脚本:
arm-linux-ld -Tnand.lds boot.o main.o apply.o -o prog_tmp.o
arm-linux-objcopy -O binary -S prog_tmp.o prog
@niube' son
代码在我的板子上是没有问题的, 不知楼上的兄弟是否成功编译代码?
另外有几点说明:
(1) 代码是直接运行在裸板上的, 而非运行在 arm-linux 上
(2) 我是借助 FS2410 自带的sjf2410.exe 烧写到 Nand Flash 的, 很可能楼上的兄弟没有烧写成功
如果能提供更详细的信息就好了, 这样就可以看看到底是哪个环节出错了!
@ggyy
呵呵,问题已经解决,一个低级的错误,原因如下:
508 + 0x8 即 516, 大于 512, 前面我提到把 Nand flash 的前 512 字节复制到 0x33ff0000 处用以设置高端中断向量表,这样当发生 IRQ 中断时,程序会去 0x33ff0000 + 508 + 0x8 处把 0x30004208 装进 pc 并进行跳转来响应中断,但不幸的是我只复制了512字节,所以 IRQ 中断是不能响应的。总结一下,对比上面提到的两种设置中断跳转指令的方式:
(1)
b reset
NOP
NOP
NOP
NOP
NOP
ldr pc,=handle_irq
NOP
(2)
b reset
NOP
NOP
NOP
NOP
NOP
ldr pc, handle_irq_addr
NOP
handle_irq_addr:
.long handle_irq
第二种方式的好处是显而易见的,只需要偏移 0x8 就能取到目的地址了;对第一种方式,ARM 要去通过一个偏移来取到目的地址,具体数值要看编译如何设置了。
@qqwe
可以这样精简一下:
putc(ch);
if (ch == 0x0d) putc(0x0a);
0x0d 代表回车
0x0a 代表换行
它们的顺序应该是先回车再换行
re: Quick Emacs Normandy 2008-01-02 13:30
@ngn999
呵呵, 在 Windows 用Emacs也不错, 有个 NtEmacs 就是跑在 windows下的, 在这里可下载到最新的:
http://ntemacs.sourceforge.net/