OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" J( _8 k5 y3 n" `# x! e8 k4 R5 d2 x6 |" B* E) g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" C8 q5 X% i: u1 L4 K#include <unistd.h>+ x$ k% b- F) _# _; U; |
#include <sys/mman.h>
! C4 Z0 Y: n, j+ I5 U: Q$ U6 k1 H#include <sys/types.h>7 i" `8 _# M: L# y
#include <fcntl.h>
, o  \6 O7 c( A4 G# M3 f/ m
, B5 o  ]! W) u7 p( `8 d! F& T#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 n( E1 d/ v2 M
6 [) s  ^5 U- ?' xtypedef struct& C! d1 v1 K( D: ~3 r# I' B8 H: t
{9 u: T( ]- W  @6 q
        unsigned int a;0 m" G3 G$ w& l2 [3 W
        unsigned int b;* C# K# o5 N$ L) `  m3 Z7 s3 T3 p
        unsigned int packet_cout;% g7 ^3 f3 q/ O- l6 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 t, N7 v3 Q0 u

* T! ?  c$ O/ K1 Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( b, f1 t/ K$ y/ w. o* aunsigned int count_copy = 0;% Y) d/ a1 V& Y7 ^+ i. `
2 g, I8 H+ I8 C- E; K6 V

5 [" d. |- @7 J& s) _( |int main()
( x  ]+ @; |9 S8 u{
7 _, }. p+ ^2 P2 l- n        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ J! `) e4 b! r7 Y1 G# m) ~        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( K3 f; _9 K; V) _/ b
7 ]( _6 X0 ^1 T; [$ U5 S6 n
        while(1)
6 p$ U$ g8 |2 K5 ]( `, T        {' \4 J" \- z4 [/ l4 U( `3 ]* K" b
                read_MSG_buffer(pshreRAM);
3 x8 Z9 |4 D. Z" y. p        }               
# u) t; h1 B  r3 e( ?2 ]}
1 k3 z  P; H" h$ I& ?/ g. ]% q9 a( @+ U
8 t# O' J3 y; mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 q- o: J7 [" @( z{
. I% O0 y' j, N        RX_MSG_PROTOCOL buf;, J5 U8 z: h6 \9 v8 r+ @/ [
        " n! y3 P1 m& \) p
        buf.a = pshreRAM->a;' m# o9 q9 m" M4 O" h1 i9 H) I# P
        buf.b = pshreRAM->b;( Z; e7 {% d; R  ~# W4 k9 f
        buf.packet_cout = pshreRAM->packet_cout;. v; `& k+ t1 S0 ]
        ) ^+ N2 o0 r, t, g- y! O
        if(buf.packet_cout != count_copy)
  P7 N3 _) c0 S* i+ V- N3 z        {
; _# }% T. W( ^0 o                printf("a is %d\n", buf.a);4 t8 F3 ^* H: K7 k1 c
                printf("b is %d\n", buf.b);
- t1 E! V) {1 [1 l                printf("count is %d\n", buf.packet_cout);
: b" g8 r, G: P2 a" P. ~8 ~5 a                count_copy = buf.packet_cout;1 ?$ f+ h) v1 y
        }
7 ~6 x' y+ s  F        else5 i4 N6 p, u$ e1 e/ x
        {
; ?# g+ Z0 m' r- X3 L& @& n5 ^                printf("No effective message!");
+ K  {+ C8 x) O, t) b# k        }
  g8 f5 z2 ~8 F# X2 m* p$ k% ]}
9 V9 V$ C7 n5 _. M* G$ Z* v6 o$ ]7 a2 L" M# ]# E  L% M5 ?) T

5 d* T7 j5 B$ B* }% J6 L# N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 o3 _3 I2 [! k0 P5 r, ~" |
使用下面代码,对内存使用了mmap函数后:0 h* g8 d( g8 l4 A7 l
#include <stdio.h>
  w1 ^- v' h4 r! x# d- A( ]+ t' T#include <unistd.h>
- r) |) g% n  m( }5 a4 p# |9 `#include <sys/mman.h>+ X5 t' N0 W: B) y& s# O; {
#include <sys/types.h>
& d8 H/ q; g" v1 a# G# g#include <fcntl.h>
6 @; ~# A& Y) J: a/ f2 q# D( d% c% L+ o
#define SHAER_RAM_BASE_ADDR    (0x80000000)
, L/ B6 j6 s, G- F+ E" _9 g; Z#define SHAER_RAM_SIZE         (0x20000)   4 J$ p; o" b! l3 v; \

/ B8 M! Y6 u; b  z! Otypedef struct
  M! @" Y3 R/ B, A6 r- Y" M" k{$ t; j" j! V6 @: O: H
        unsigned int a;) ~' G. R, H6 a$ ^/ ?( z1 ?
        unsigned int b;& v. |4 E1 \; g6 F* Z9 y  B2 k9 g8 z
        unsigned int packet_cout;
: ~# F& b3 }& U8 e# ?7 r$ N6 P7 F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 b2 S" H  B3 N! m$ X: L

. U7 L) E- `$ h4 ?! `void read_MSG_buffer(int *baseaddr);' i( R$ x7 S. d) D, M; X& a
unsigned int count_copy = 0;# L# m, ]* y8 o/ h! J  H

* q+ E) g* y  v/ A# \int main()
' b# T4 j/ H+ s8 L{
! N8 V. T6 J! L  Z  D        int fd;! R5 z' a- T3 F: t9 P4 e
        int *mem = NULL;* J$ y9 s1 y- y6 Y: Y0 L( j! z
* W; i% }" L" }; M
        if((fd = open("/dev/mem", O_RDWR)) <0)
; K3 s' H8 V6 r3 w# |0 Q4 E        {
) i, G  a- ]$ ~# i3 k1 u/ [                perror("open error");" N, _+ F1 f% c, W4 L# ^5 o
                return -1;
( W0 t1 D$ G5 H* F* I/ S        }) ~5 N* I4 R4 T, f
        . `% a+ v+ ]* G* K" c0 ^
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# Q* j# l# q! {0 B0 s; E  |0 c8 a' o# R
        while(1). D; ]3 T- Q' c# ]( e; ^9 F
        {
/ [% [& V6 I- E+ l/ j                read_MSG_buffer(mem);/ ?/ b- }0 r! f- ~8 P4 R! e+ M+ Y
        }               
) f4 j" ]; p+ I* H9 W: J& A}
4 G9 K) @6 D+ P7 {8 D! \1 d
% H% E" x4 y4 N: [! Wvoid read_MSG_buffer(int *baseaddr)
4 M/ R# o. y0 `6 ?- A{$ l! w, ^2 N1 v- T' z# e. |4 g9 n- f
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 }# W7 H( I! J! b% K* w# S1 n* |$ A, a2 S) ^
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' G+ L1 g& u- h" M; i
; N9 [* Y3 Z4 \: u1 [# z& q' U        if(pshreRAM->packet_cout != count_copy)* q* q0 b4 H/ `3 G: r6 q2 \
        {
; K7 O5 A- m0 _+ f( F                printf("a is %d\n", pshreRAM->a);& a& y- [% G8 u* T
                printf("b is %d\n", pshreRAM->b);
9 T( B5 f$ ^$ g) p& e) M                printf("count is %d\n", pshreRAM->packet_cout);+ X" ?, K6 v* t8 g3 x2 D* c
                count_copy = pshreRAM->packet_cout;
. J6 @# O- w" S/ U3 w  c: K        }
( B8 `* w( g/ U5 d        else9 q6 V- ?  n7 D; p3 s
        {
! ?4 J0 H4 ~8 y4 a( ?" |/ i                printf("No effective message!\n");/ e' J, H, E# V' Z' Q  U5 Q
        }) o, |! V- N/ m- M# M
}: t( {5 L3 C2 e8 @* z% E7 ~
7 ^1 d0 s% k& Q: o9 |' K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  }+ x% l5 X2 y- ~: x* S
7 r. P- l! o: p; ^) k6 @

1 z7 ~) n* c8 v. n* g4 ~0 P
/ i$ l" I' Q5 V! k0 y
; F* Z: q; U8 L- M! H" R( x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-27 06:09 , Processed in 0.039651 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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