OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5931|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * h6 I& _# k2 Y

0 q* P3 o! V) W9 I" f" o8 p  JOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" j! T. M9 v" P# B! \& i1 E#include <unistd.h>
7 y; l( O+ A' ^# B) J#include <sys/mman.h>) A4 L4 Y4 f- d8 h
#include <sys/types.h>
# X8 T$ z" `/ P' ]5 U7 O0 T* b#include <fcntl.h>% N. X5 c; u, f) _& Y

2 `& d( F+ T! q( V! U3 w#define SHAER_RAM_BASE_ADDR    (0x80000000)   - z! F/ q: e' ]/ l
: r6 X/ z! S5 _8 j( h# @
typedef struct
% e5 X: v% R% O$ w5 s  w9 R{$ ]' ~6 R5 `4 L% i4 v
        unsigned int a;$ d; H8 d8 m( b+ i1 k! j! M0 r6 i
        unsigned int b;
+ Z3 Z" [# f4 v4 M        unsigned int packet_cout;: ?/ V- i% O9 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 G1 K& \& Y' c3 S# r  l+ V1 ]" l) [/ f: h% z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% s; `) R2 b/ a) Uunsigned int count_copy = 0;
% d, x/ O: q- l7 N0 Q* ^! p0 x# Q. ^! e1 Q

5 b( z  K$ ]7 A* Z' D) Gint main()
$ X/ i  t; ?# J" t{
2 ]0 V7 N' D2 M6 _        pRX_MSG_PROTOCOL pshreRAM = NULL;
! j3 u. X7 d/ A2 C9 U        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 W/ V/ Q7 {5 P7 d

( l& f( f% i4 ~        while(1)% D7 K- }8 J/ Q& l" Q( T
        {# g& M# _* \; P/ Z' f
                read_MSG_buffer(pshreRAM);
) D6 j0 O7 v8 Q3 s) P! R9 Z/ ~        }               
$ w; x1 P* N8 Q2 u$ w0 r0 ~}
8 \" p4 T0 [: w1 A3 G6 a% X' Z1 u4 }8 y5 _7 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 C" b. B+ G8 T0 R0 B+ e
{
" Q8 O1 Q" T& @( Z$ u( g        RX_MSG_PROTOCOL buf;
0 ]! T8 Q3 o8 H* S6 N( A, y/ \        $ s# s% g9 I: \
        buf.a = pshreRAM->a;5 S* {4 x8 H- h& {& t
        buf.b = pshreRAM->b;
8 e/ S6 p3 }. H) m: Q        buf.packet_cout = pshreRAM->packet_cout;
3 ^* ^. _6 L: `2 b5 Y0 [        : w% L* k9 K5 `4 E3 A" Q! }- a
        if(buf.packet_cout != count_copy)
2 w7 _# O/ h& q7 X' Y) {* h        {
/ A* e& S5 r$ t# _, k" @) y                printf("a is %d\n", buf.a);
) k6 e6 l$ N5 i: }% h) P. \* r) o                printf("b is %d\n", buf.b);
9 T" d- G, c$ o: S$ C" @                printf("count is %d\n", buf.packet_cout);
; n# Y# ?& p6 V0 x: v5 w9 Y                count_copy = buf.packet_cout;
& A. _+ i) V6 D        }
1 _% _8 T" Y  ~* r5 A" d        else/ X. |. L0 [- `# \; e/ D. a: R
        {
8 j1 K/ q' Q# ^/ K" o                printf("No effective message!");
1 o4 w. r* H  |        }2 q, E8 b) ?5 J! o; [7 W
}
: i& W2 @& U- @; l" C) _0 A5 H0 [; @/ F

% A% [: _: y) S# |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! o5 h  F+ O& o, b9 V
使用下面代码,对内存使用了mmap函数后:( h: U1 m% T/ s' ]* X
#include <stdio.h>
# p: e" _0 ]/ f7 F& V6 D! k#include <unistd.h>
5 }' O/ C6 ]6 {/ U#include <sys/mman.h>
% w/ I/ ~: n8 m( u( Q8 C7 w+ ~#include <sys/types.h>
9 r. P, z2 w+ k8 H! @" a. X7 m# o( ?! `#include <fcntl.h>% t, H5 M3 v& v- s0 ~$ a

0 w' B. ~1 g9 L% u( W' {5 J( V#define SHAER_RAM_BASE_ADDR    (0x80000000)8 z$ w6 z$ o' N8 a: Q7 h
#define SHAER_RAM_SIZE         (0x20000)   
& V  b( f! X0 \3 M8 Z4 T4 G/ O) d. U+ [4 w' c
typedef struct, |. ?# N* K: ~
{: F3 c4 u! z) f5 s& R
        unsigned int a;
' I/ f$ L; b9 ?! B4 e6 Z        unsigned int b;8 T' ?% J( E7 y3 z& i
        unsigned int packet_cout;+ @3 }; H( ]( N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 K6 ?2 J. u, A( K
5 s8 ]" \/ j+ kvoid read_MSG_buffer(int *baseaddr);6 i3 q9 |5 \! ~8 {
unsigned int count_copy = 0;" g0 @( P8 N: X9 h- K% ^3 ~
9 a; G0 G' a6 W- w
int main()- _- L( j/ G: S" I7 q. x2 _
{7 E! S  D' \' y- D' E+ ^7 w
        int fd;8 A* f$ R8 P% ?7 n7 U
        int *mem = NULL;
9 x" u2 t! @0 Q8 N8 V  X2 d
6 W5 e. E% B8 Y: |        if((fd = open("/dev/mem", O_RDWR)) <0)
0 S2 E% P4 L1 D3 Q; [# {        {& o% A! E& @3 o# o9 I
                perror("open error");$ b, r, N- L0 [# [6 K
                return -1;# B% E5 ]5 ?$ C1 \# B0 V
        }9 n5 c' T/ F0 R7 \
        7 b4 o+ `. t5 h$ _! V- ~" E
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 J: A  ?1 P: f% n; W2 f
( P- s! M/ B" F% J) r' J. D7 p        while(1)
( {9 n- Y  x7 f+ b9 t" D% A' q! b        {5 E2 B* i2 ~: r0 N
                read_MSG_buffer(mem);
+ g. g: A1 H  q4 T+ G3 l        }                ' Q4 N( ]& J, Q3 F! E
}
* b0 A) I9 p* S9 R9 j1 ^" [; U
% `3 q& {7 B5 b# h( fvoid read_MSG_buffer(int *baseaddr)
( t( X) B+ r' \3 l% Z/ C{" m' l0 H- i9 M& Z0 J$ }1 ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;- A9 s4 I6 C  S2 K( w/ {7 L5 K

; V) A! |. k6 m# }( Z( G: M        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 e( C. ~/ }+ `
7 e6 b  g- x% \
        if(pshreRAM->packet_cout != count_copy)
; I/ d  H6 J: S& V* n9 R% V        {/ |% B: O. B- l$ B
                printf("a is %d\n", pshreRAM->a);
' I/ a# P3 s/ z! w" E: F                printf("b is %d\n", pshreRAM->b);( J  Q* n# [, ?( V
                printf("count is %d\n", pshreRAM->packet_cout);( h6 T% E( m! u5 Q: X" H/ t. T' p
                count_copy = pshreRAM->packet_cout;* i, h# c! z; \; V
        }
( q* b; u; }( [* P: W        else$ ?6 ?, k6 f6 s4 }) m0 K
        {
6 L. h! G' \9 q                printf("No effective message!\n");! \( V9 L8 r3 v" I4 v
        }
# w2 w6 I0 R  w- h' n}
5 Z7 W* r* Y7 Z. n1 s* p$ Z$ }8 `: E. v" E; Z$ R# z* u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! g) ^. s$ O" T% V: k
& u  @0 w8 F/ D' r- G9 X. C7 e+ X9 N/ ^" O5 ^9 t, K3 h0 P# u
; m  B% M' i# q
* g. b9 b, O5 x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-3-16 02:14 , Processed in 0.039441 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表