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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, x! j; k, I$ m* `1 H( y, A9 u8 K: m9 i5 G( M6 j5 h+ x7 ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* I" F, z6 c4 G( u: d
#include <unistd.h>
( T) N* x$ F8 E4 [* O#include <sys/mman.h>  y  \) S7 e5 J& F7 i: a8 i4 ]
#include <sys/types.h>
! |6 x, b9 y/ U/ @# i/ K7 R#include <fcntl.h>0 [& M/ }: i5 x9 n5 P* \" C
: B6 |: S4 r! G; H) Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 K( j* q2 X: o. l  x+ a

; A2 E: F" N2 D; z8 Etypedef struct
9 f" L% [" v$ h% _! |! U{/ w9 }  Z% {* w# [+ A8 Q/ Q
        unsigned int a;
6 }9 c; U! b8 d2 Y        unsigned int b;
: |- r9 t! F1 U3 P- S! Q$ A        unsigned int packet_cout;) q8 a) P9 Q; Q9 q# n& l: a4 Q! ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, G4 n: d$ v" O! d- }3 ?7 `+ z5 }
% J' K" e+ E4 |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) V! H' o+ F( S+ D/ J  qunsigned int count_copy = 0;, G" H" E4 w0 e9 c0 U

" q9 e* E: g# h1 Q* j1 V; M$ P$ O0 Z: u+ [0 x7 ^) c
int main()
0 R8 m3 C6 \7 x5 b) g{: Z$ c% E% B; l3 F
        pRX_MSG_PROTOCOL pshreRAM = NULL;
& Y4 t; ~2 ?9 `5 ^        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 N& E2 `8 E4 D; |. f- A8 f6 O# |9 N% q
        while(1)# K  i/ d9 }, v/ ]  H8 b+ D4 ~
        {6 a0 u1 c+ W1 f" c
                read_MSG_buffer(pshreRAM);. w8 ~3 B; j  J+ Y6 j
        }                5 M/ I- ~5 o5 M4 w9 w  i  R- v3 l
}4 n5 m; e3 U- A2 f$ W* ]3 ?+ p
8 r& E5 f. o$ V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 ^: q: {1 ?; I' L$ u- ~! X{9 q9 n) u  K1 C
        RX_MSG_PROTOCOL buf;
, @* o! B2 i: @7 M        9 k9 P% D' p6 x
        buf.a = pshreRAM->a;
+ i, S! n) q$ Y) F+ @, X        buf.b = pshreRAM->b;; x" i8 M  N, b! n$ Y* @
        buf.packet_cout = pshreRAM->packet_cout;
" O" e7 z. U9 h& E# A* K        
  T3 ?2 c/ q& L( q( g        if(buf.packet_cout != count_copy)
3 K$ c. a% C# z9 w" ^! j+ ~        {- Q, d; R. f" T
                printf("a is %d\n", buf.a);' O$ C+ X6 v9 O& i* f+ ?
                printf("b is %d\n", buf.b);, z' w& u! V. y8 T; U+ l3 v2 |
                printf("count is %d\n", buf.packet_cout);) r: X; M3 [4 N: K) W! E. u
                count_copy = buf.packet_cout;  [1 Y" L5 E( d
        }& c% S1 K( o* t; T# G
        else
: b9 N" q2 e2 j, R9 y4 x. s        {  A! `% R* W/ Z8 @  e1 i  v
                printf("No effective message!");7 m, g$ c1 G4 v0 U8 X8 ^
        }
: v/ t1 F, S. l4 C6 _. M5 ]}
; F& y7 R6 p7 s5 V& h$ x0 G
; X4 o6 u$ Z2 W1 O$ m) n/ {% Z0 {  a# B9 `0 q8 v. ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' ?! p8 g# K( ?. K+ L
使用下面代码,对内存使用了mmap函数后:* l$ k+ m4 Q$ X/ }# H; s
#include <stdio.h>
7 ^. t8 f# T+ S' N& s1 S0 f0 q! j" }/ x#include <unistd.h>
  v; k  u4 H1 x# Y6 n1 d; e0 p+ G#include <sys/mman.h>
6 R8 n2 |  f7 V/ @#include <sys/types.h>5 ^' ?+ k, L' S! T0 L4 z% p
#include <fcntl.h>
0 e0 V; n6 c$ R& x
# b4 C, t, k% z6 S3 l- X#define SHAER_RAM_BASE_ADDR    (0x80000000)
; U6 q% w. v* ~/ k, F5 h#define SHAER_RAM_SIZE         (0x20000)   & J$ }( J4 p6 ^$ V/ G2 {" O$ D, z
4 d" Q0 b& W* e. f! R" U8 H
typedef struct  V+ Z9 C3 c9 f7 a5 U5 R, G
{: \0 x9 H$ d+ q; \
        unsigned int a;
, \4 e- w- p3 w: ^  V( ?  G        unsigned int b;- U8 O8 R) u! j
        unsigned int packet_cout;
0 Y% A- U$ W% d" u. n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. q. X! w2 j5 G7 U* [  I+ a
! v2 h( V% |; s* V" q' Lvoid read_MSG_buffer(int *baseaddr);5 |  K- D) u/ |
unsigned int count_copy = 0;
! B# q% q3 [7 z  U! S) r9 P8 H: E( J% b& Z: N& _
int main()& `0 z! M* f' q8 N
{
* w  O$ {0 H% e1 x        int fd;
( b  u% m8 y+ d5 P' r; U# ]1 @1 I        int *mem = NULL;9 v" W2 L% [6 k( M! D8 R

9 C+ p' H; p; U- h* e        if((fd = open("/dev/mem", O_RDWR)) <0)3 k9 m% t0 ~& V! ]8 p/ Z- W
        {0 y% N9 ^  |8 u  F
                perror("open error");& {! \  m0 z4 @% B8 A0 ~- ^! I
                return -1;5 Y" m) p/ S  G  A
        }2 ], Y6 H8 F2 U8 e: k
        - X0 V) q7 z+ v: N4 N
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ o+ h% _. I  ]2 g1 g

. }9 R( U$ k! ]5 c5 l6 }, g, U7 j        while(1)
  g$ s8 [3 p- l# h4 \! \, B0 e        {% }( Y3 M2 ~1 H# _" i
                read_MSG_buffer(mem);7 x+ R! E0 g3 @
        }               
7 g' v  B% Z7 e}
: `6 P* h% ?* g
) s/ i( f- y1 X& ?  l1 ?" l, gvoid read_MSG_buffer(int *baseaddr)% x: M1 {5 |4 A# r1 N2 m, I" Z* @
{" k3 ?: [* w8 a$ j7 Q; T
        pRX_MSG_PROTOCOL pshreRAM = NULL;% ~0 b1 ^4 r+ \+ e; d

/ r- F- r  U. ?% A( ]+ X        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: W; l/ o9 d$ M' _& f( P2 V. n; F
        if(pshreRAM->packet_cout != count_copy)& k3 F) Q2 T2 v" L3 Y& y# U
        {! r8 W* E" @! q" Q4 j
                printf("a is %d\n", pshreRAM->a);6 t9 f0 o3 p) z8 W; K) c. p) Y  r
                printf("b is %d\n", pshreRAM->b);5 y% p" I. W$ S6 E- P1 S, ~
                printf("count is %d\n", pshreRAM->packet_cout);4 N4 e- N# z2 T, ~  z% U
                count_copy = pshreRAM->packet_cout;
( T6 ]9 b7 ]9 G- {! {& Q        }9 k6 h3 p( q9 G; t' Y
        else
: n- p6 E/ P' X: a+ c9 C        {2 s" B- H0 R! X+ \  K
                printf("No effective message!\n");
( {+ Z7 v$ ^( M6 T7 D        }
+ N- M" Y% D9 m4 Q8 w  J% ~9 E. |}" e: E9 `" J0 Z; o: S" x0 Q4 T
' w$ q" K3 @1 F8 e! y; N5 d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# E5 Z0 U* f3 z( P$ _9 r5 _1 b4 J/ T
! {9 l+ H; O! o
" O, M, l: U; A8 V# Q* `& X

( P6 A( v! J! _! J% e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-5 04:39 , Processed in 0.040495 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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