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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! {6 A4 \" i. e: l( w" T
) w0 j3 ?* K* _" `& M: g9 a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 R2 C. I) f# \, v) S#include <unistd.h>) l% E) o3 U3 L8 J
#include <sys/mman.h>; P# G; G6 N. h4 S2 r  X$ E2 D
#include <sys/types.h>
# p2 W) l  H3 S: K: F& q* q! M' g#include <fcntl.h>
0 ]4 x6 D% y9 W; ^( @/ E6 L, m/ s5 d$ h, ^  P( k
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* K5 c2 a! Y7 i
; x% x- T0 _; W; s+ e0 Rtypedef struct  K1 g% \9 V0 D& Q& ^  d
{
4 w) V7 F! c8 M/ g6 N' q        unsigned int a;
3 A1 C5 N0 q5 N# }        unsigned int b;! ^" B' h2 i0 G& L7 f
        unsigned int packet_cout;- ^0 |3 U2 w! S0 S+ v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 Y- N" y  |2 g2 t+ y7 R; c1 ~* E4 B2 k0 }- G6 W/ G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- q2 S# l; [3 f  Y+ r3 K
unsigned int count_copy = 0;
6 N3 w& s) x2 k, X
. Q- F8 s7 T# x2 y) r! g9 W) h
- L; d- G; q2 a2 W! m) Uint main(); S( g8 i3 g% C' i
{
2 U" I3 @3 l" ?; z# r/ v        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ H$ O: B5 k2 \: x. ]        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( T+ G) C; D! U! \! n( O" p2 Q* v) C  u$ x
        while(1)( b! t& g4 Y4 x: M8 h
        {1 h& o6 M% X* e) [5 W
                read_MSG_buffer(pshreRAM);
, V) \! P) Q6 a: v, H; R        }               
& H8 s  q6 }0 [}
3 p' h! Y* g# H: s5 n) \) m! }! a& v" ^; S. i% D/ D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" N% p$ o4 o, T1 k1 ?4 T5 d9 O
{
4 g' T; N& R1 f9 t4 X" b- i9 L% d        RX_MSG_PROTOCOL buf;+ w9 |: A) P; R0 f3 m2 r
        & G5 c2 D" q- x* J( |4 w
        buf.a = pshreRAM->a;
. q) e+ m2 x9 o; M1 e3 h        buf.b = pshreRAM->b;1 u# u9 |8 N7 B/ _( H
        buf.packet_cout = pshreRAM->packet_cout;' p( M) B$ X$ `& y2 B0 z( M
        
6 y. ~6 z1 y' ~5 g6 \- J- F        if(buf.packet_cout != count_copy)6 }% |3 A6 U8 Q: X4 ]$ Y7 V
        {& i9 |& R4 P7 v: N/ S- T; z! T+ C$ J
                printf("a is %d\n", buf.a);; z6 J/ h9 z& s7 t5 _
                printf("b is %d\n", buf.b);
6 ?; S, f( u8 S. P+ p                printf("count is %d\n", buf.packet_cout);4 D( v6 m- v6 ~' n+ c  t
                count_copy = buf.packet_cout;9 [4 Q' M7 @# |# u7 V
        }% l9 p. ?  l+ [$ R
        else
  b5 x9 L3 ^- ?        {
' l& o  |1 O; J, L                printf("No effective message!");
1 o+ J" W; N' Y6 ~  O9 I' T        }
6 M4 X, ~& D3 j. U/ ]* I}
0 s# i5 J0 b0 X' L5 e( P" o( M; X! Q/ o0 m  T8 ~- X
$ ]% u* V2 U8 G: j) C% y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; B' }) ?" R& T9 x* g; Z% k
使用下面代码,对内存使用了mmap函数后:
7 g6 f+ E/ v5 S. S#include <stdio.h>. c- _2 R2 p# _. ]7 V: I
#include <unistd.h>
. E/ T4 k9 x: n#include <sys/mman.h>
) n/ }3 L' }9 q$ n9 E6 _#include <sys/types.h>
/ U8 K5 T+ z2 b" ^* @+ P#include <fcntl.h>8 F. V' U/ p; z6 c( T
. X# |# q8 B# j1 o( P8 K8 k7 h
#define SHAER_RAM_BASE_ADDR    (0x80000000)
4 {: V& k  P8 _* \9 {#define SHAER_RAM_SIZE         (0x20000)   
1 O0 x2 A: Y, x$ E- v$ c9 D+ o. L) M# u6 e5 x
typedef struct5 m. H4 F3 g' e/ n2 f5 f
{
; I; }3 L# [7 B4 X, v! x        unsigned int a;! ?6 `: ~; C: O: o. l( e9 O
        unsigned int b;
7 s3 d, o1 _7 `4 `7 D        unsigned int packet_cout;
$ q7 T9 R/ B6 S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' ~7 j$ p) ^  F( U' c$ ~- M& B* ^2 c* ?% p. T7 A& W  X+ g
void read_MSG_buffer(int *baseaddr);
  X. \0 }- V) B1 X; r5 Wunsigned int count_copy = 0;4 i, U2 r- V6 v# E, \- K. B

* |( l8 f/ Q# L& |- ]% kint main()5 n3 Z: q1 k7 `: @+ Y
{: D+ r- q* F: Y2 B/ J1 |# f
        int fd;( S, A" r9 }7 ]
        int *mem = NULL;
  N" M0 U& _- r3 ~' ?0 E5 M( u" i/ U) B" n6 q! ]
        if((fd = open("/dev/mem", O_RDWR)) <0)& g5 _- V5 f, C- ^5 b7 u+ e
        {: e/ V% m+ E1 ^: b4 G0 ]! c
                perror("open error");, x" L) V8 g8 V; S! M% m* j
                return -1;
) ^* }) q' R0 A" u. Z+ M6 L        }* P% ~  F3 l9 \9 D  ?7 }0 u! K
        
. l% |" F- G5 m, E7 w4 z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 y3 u5 U" J/ S( d8 g
2 S$ T# ]  p; G, B) P$ s        while(1)# k+ H8 p4 o5 w2 E
        {$ O% M! f1 D& O$ n3 [* G) X
                read_MSG_buffer(mem);1 q. |! Z0 W0 c$ i3 o' d' z3 r
        }                / g& z3 w# D& f
}  J& v( \2 v9 g8 C3 H
7 A# P8 y$ l' p/ f" h0 G: {
void read_MSG_buffer(int *baseaddr)
- w- ~0 n9 _  M% k  t6 G{$ A- f. \4 H5 ?. N! b
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' D! _8 a$ e- m/ Z- K. F. ]# Z9 f* z( O* g  `% U- j/ r+ o, q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& C" j8 w& ~/ X6 y* p

' u( ?  q# {0 ^2 k2 v        if(pshreRAM->packet_cout != count_copy)2 ?% g2 `' |: }2 U/ d
        {9 ^  a( q& \, I5 y8 H
                printf("a is %d\n", pshreRAM->a);) o0 f: y/ u# l' m; @. r& i4 A
                printf("b is %d\n", pshreRAM->b);
+ y+ b" s* y2 @* W8 u/ ]- l! B                printf("count is %d\n", pshreRAM->packet_cout);
9 G& E- {' c. O. y' e                count_copy = pshreRAM->packet_cout;
& j8 g/ t" s1 i' t        }
/ e2 P9 s7 j6 h% z5 K$ U  q        else4 f0 }/ f' {+ z  q% h' b
        {
- d( M* o3 Y3 e$ {                printf("No effective message!\n");* e; Y* _, k# [6 k
        }
2 W) x, S8 i% f5 U+ S9 G}) Y+ @' {' |6 [, M% m3 _

# S0 M. x0 X1 [5 `: E没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. E, u5 r5 R4 A( {3 ?% s

' A4 ^- b/ Q7 X- \; K: k% p+ \# M( |6 k  {2 v) e
9 K) |# c0 ?! |7 a
& @2 G- c  L5 c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-26 17:46 , Processed in 0.043031 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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