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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & x, n% n8 o4 q% Q9 o% k* U
8 ~# Q* t" G6 n  P, N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 O( }8 {+ ~2 d0 M9 G- l+ B$ l# O: ^" P9 i#include <unistd.h>; |+ j/ b0 w2 J' X2 k, W
#include <sys/mman.h>
% u" u, E6 L0 x& L7 d#include <sys/types.h>5 `8 a2 D. L0 ~5 y- _2 [8 M. T4 [
#include <fcntl.h>
+ S7 T& `: y5 t3 ^* z8 k0 y+ Y- x* |! L" ]/ z! w
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# }, d5 L% o/ }( ]6 C: l- ^# z$ L% f
typedef struct
5 k$ a( {' F; C9 d2 o' M2 V{
# v! V9 M2 R  Q. @        unsigned int a;) F4 F4 C2 k9 ?( [8 k' C
        unsigned int b;) ^5 {8 A- f% d  R- K, I+ R
        unsigned int packet_cout;7 I( e7 \( K  q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 i6 @, i7 Q4 Z/ f2 p( L" x+ p5 k. l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 O# x5 ^7 L, n5 X3 B, l" U( p3 ^unsigned int count_copy = 0;( A  Y3 M' ]6 j. O# H4 v0 g+ L. \

% B- `: l% T0 @  \7 R7 z9 c9 l& S* x* q! x
int main()! t$ V; i9 T8 h/ B/ `, _8 `
{8 v" x8 w, G: u
        pRX_MSG_PROTOCOL pshreRAM = NULL;& |& l0 D8 g6 o1 d
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 P3 E& N, K$ w$ X
4 f! |. E3 o3 ^/ g6 D        while(1)
* H6 \  _0 x2 \: ~        {
, ]8 _* {2 g! F                read_MSG_buffer(pshreRAM);
4 x8 c  p6 V* f% L0 b- J/ c+ s4 @        }               
) q& H3 m, u: M1 u" o}1 k3 D2 U) r: _- c0 M- d
% l+ N5 F9 w. b: B: T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), {0 R, |& J& t1 q. n) E
{
0 X$ B# Z  K3 m. n8 e0 B% k        RX_MSG_PROTOCOL buf;  ?; O7 C% k0 S7 \; h+ a+ Z
        
( b1 w# j: Y% p$ Z  Y3 k$ e1 E5 y        buf.a = pshreRAM->a;0 H" K5 ^- |, ~
        buf.b = pshreRAM->b;- Y! Q, C1 U# C5 ?
        buf.packet_cout = pshreRAM->packet_cout;% H. Z, b, t- Z; \) @
        5 w7 x/ g# `, Z: q* G1 F; E7 i; o. z9 x
        if(buf.packet_cout != count_copy)  o* a6 O: c1 }9 Q+ Z9 P
        {
6 }" N% n* N0 |: D* L3 l                printf("a is %d\n", buf.a);
, a% [. }1 h( t( H" L9 o* p% h                printf("b is %d\n", buf.b);1 M& L/ ^0 \( p$ C2 T  p& r
                printf("count is %d\n", buf.packet_cout);
( k# f* c/ G' K1 w: a- N% ?; z7 L, F                count_copy = buf.packet_cout;, B4 L  w) B% P* g, w4 Q
        }/ F1 K( w9 J; n7 r: P
        else5 U( D! c: R4 r/ n
        {
7 f/ a- k* }# R) P                printf("No effective message!");
. Q0 l5 i& g6 t& c- C; @  G        }
& O0 @; z, H- U0 h0 q}1 V) x/ ~; Z6 N' I
: d" M! Z) t) ]
, I% c$ E1 |! i* F6 `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 ^# H/ u- [1 d( ^+ m- r
使用下面代码,对内存使用了mmap函数后:
1 s  Y# b4 O; N: D6 Y5 g/ ^- Q# y#include <stdio.h>  G. s/ T! {# M! Y! ?) |: M
#include <unistd.h>+ a+ Q4 X7 i; m7 @9 c  t
#include <sys/mman.h>4 T( U2 a0 R: g) u
#include <sys/types.h>9 P9 `+ x) |* Z: e6 |3 c
#include <fcntl.h>
, k7 g8 \; d8 w: `5 w
7 Z" g; P1 b1 Q4 b' g; v% C#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 d7 Z( ?1 ^9 g/ u- e. a#define SHAER_RAM_SIZE         (0x20000)   
  g0 j) n$ j3 k4 W: _6 N' W0 w( A! L4 f
typedef struct
% }5 R/ s+ n. G% m& W! b4 E, Z{6 e2 m* x: C) ^  ~/ y$ b$ ^
        unsigned int a;$ g9 y2 g1 V8 Y' }% Y( d7 g
        unsigned int b;! J6 G7 ]! U! {" V
        unsigned int packet_cout;$ y! P( i) V" [' D$ m. U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 o9 t. A( t* Q0 I

* O2 L8 L( S0 jvoid read_MSG_buffer(int *baseaddr);
; [- E) o% ~& Kunsigned int count_copy = 0;
% ]  S& }! \5 Z, M1 ^& ?2 @1 F2 v8 l+ O" p* K1 Y1 v
int main()1 q2 I' n& d7 m$ d- E0 V) o
{! X$ |/ v$ d3 y+ C5 z: i
        int fd;
& a( L5 ]1 M5 _8 L        int *mem = NULL;% i0 g9 x$ }7 B) ^/ O
. @3 F4 I$ C. c
        if((fd = open("/dev/mem", O_RDWR)) <0)
# j3 q; W5 g* |! ~1 c; O2 {        {$ j+ i8 p9 a% _
                perror("open error");
* m" ~! a0 s/ X% g/ ~0 L1 G5 `, o' ?                return -1;
+ |, k7 v) _8 _/ r+ o$ w$ E( c        }
) ~6 U. n7 ~% ?3 ?1 a        # }2 `& E2 u6 w. \/ V* P
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, g- S' B" n) z1 [! E6 K& O8 S
* X" r4 N( f$ Y
        while(1)/ l  t" x  _/ d: A* V$ ~
        {
" F; u/ j! o. ^/ M8 f# r                read_MSG_buffer(mem);
7 d& t) @% M: Q9 y. H; Y        }               
, V8 d3 L% P& R; \: z/ j1 f* X) \}
/ m1 ]0 S% W' C2 ^+ D3 y! _  h* _7 T7 q
void read_MSG_buffer(int *baseaddr)0 r) V2 K# y0 O
{* X" Y8 W. r" s+ b+ r: l0 f
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 U# G2 j9 b- }$ z  i" d

! r" n" ]% W2 b, a4 M        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! q% M/ G( H1 X/ v. z8 z

6 s2 Z$ r, B0 K; N        if(pshreRAM->packet_cout != count_copy)  m. U, E$ _. o1 _5 g
        {
3 r- w8 ?* n: \3 D& \; i                printf("a is %d\n", pshreRAM->a);* M  s% V5 }/ K4 v9 k2 Q
                printf("b is %d\n", pshreRAM->b);( E: {' J% z$ \4 f$ X8 r, f: _
                printf("count is %d\n", pshreRAM->packet_cout);" D7 [& z& @4 m9 k/ v
                count_copy = pshreRAM->packet_cout;
) i; X; f: U* m8 N' f6 ~" k/ V5 H        }5 J) A, }9 `% u8 N3 B$ ]$ I
        else) D1 I4 [: X' x% c5 F
        {
; |: Y& ~* H8 d7 g* K7 c+ z0 I                printf("No effective message!\n");! D# j/ p6 `% T0 _* h
        }/ E' J7 C% E' K/ s4 V+ l
}9 o1 _4 d! j4 b* w6 ?4 Y; D5 O
* {: b- i5 E: U. B$ m! D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) R5 c) j7 I6 }8 x7 S& `3 K* h5 k2 }
8 d) s; i2 {  @  k. k

" Y6 R+ f- D6 s: C/ N2 a$ x( @5 ^, Y+ F4 B4 H( Y6 L( s  F
( J. M( y! C8 Q; G/ O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 03:52 , Processed in 0.040164 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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