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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , g" b* I, [- ?) c) G! u
8 y3 d9 w' f7 \5 B+ ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' K+ ]2 h, a4 W1 Q; n1 b$ ~#include <unistd.h>7 k! Q6 J# Z9 f: X' P
#include <sys/mman.h>
  U$ t7 ^. x. x8 U#include <sys/types.h>. M( S/ a& D* k+ E& ~# a7 h
#include <fcntl.h>
0 }2 ~+ D6 N  z5 S3 h# u3 x, L! J* f  F1 f. u3 H* g5 |
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! F  B3 x% z9 V+ B/ v2 O/ P
! b! t( d. G! D2 l3 B+ u# F
typedef struct
! \0 I9 g( ?. f( u{
) G$ `; w  _8 B% J/ p. C- ^1 \        unsigned int a;: y' {# P9 x4 H: z/ e1 c
        unsigned int b;$ F1 W: q# D& Z
        unsigned int packet_cout;/ [" X4 h) z6 U9 `: L1 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 G" E9 R" B/ H6 k0 g: ~% Y  I" X, T, Y- L: N% Q# @3 Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 S' G7 }; c* @( [" S! Q9 B
unsigned int count_copy = 0;6 C. }, \, p  m8 S0 z0 F4 ~
, c9 l- j  _6 X% u4 i( V
8 X# @, N" `  w4 p$ \
int main(), k' W- T3 C% x, e* y+ Y$ l
{
) l3 F% a5 t1 [7 Z        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 U- S+ V2 Z& n0 V* \7 B        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. a- h8 b" ?. d8 C0 Y* P! h1 ~' M& t7 Q/ l5 a( K0 p
        while(1)
% f' v, ~6 D, l        {0 w5 ^- z. ]  @  k5 j% c# i
                read_MSG_buffer(pshreRAM);3 V1 T( K8 ^. V
        }                4 s3 |6 K1 x8 r
}
/ y" ]  {+ D+ A' f, T5 V% ~6 \( ^- Q# [7 B1 K& f# O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' o+ ^! C; U+ y& q. Y$ o& E2 E
{% m9 K8 D* Y6 e( W. G4 U
        RX_MSG_PROTOCOL buf;" V$ L! H9 l  }  `+ R9 }5 Q- a
        
( p' T; Q" ^& T6 `) A8 t+ N        buf.a = pshreRAM->a;
! I5 \2 ^7 ^" H, V3 o5 ]+ B        buf.b = pshreRAM->b;0 l3 y! v$ K, B2 T( B* v
        buf.packet_cout = pshreRAM->packet_cout;
3 ?+ Z# I; @( J7 c        
7 \9 q/ v/ }. j: f        if(buf.packet_cout != count_copy)) B$ c% D3 L/ j- f
        {9 u* ?2 V. G1 _$ i# |" M% F; d1 p
                printf("a is %d\n", buf.a);  e. ^7 r- j* Q- }  b7 r% E) s
                printf("b is %d\n", buf.b);) A, p6 t; M# [$ N( J
                printf("count is %d\n", buf.packet_cout);
3 H& L. r  d/ O; W                count_copy = buf.packet_cout;
7 U% b& e7 Y7 g2 n/ a9 k" G        }' j8 @% c" \& s' S( r
        else" _- ?1 w1 m7 P& K
        {
9 T. P! @1 l9 _8 y' K3 J! s3 }" x                printf("No effective message!");
$ V7 k" ^1 g+ Q1 Y& y4 v        }
- z- B; i2 h/ ]: B; W* s}
) f& @( {- q4 O7 p# Z
. k/ u* u% h6 v' v! ^& g/ S) `" }9 u9 i4 N  y- R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 f; H4 _9 t* R7 O- u; M' ]; |使用下面代码,对内存使用了mmap函数后:
6 t' Q$ o0 E1 v1 C* J; {#include <stdio.h>
3 W* ]! q9 |; V, s. b" ?#include <unistd.h>3 t/ B+ y/ C$ ?; R
#include <sys/mman.h>
6 A& j- Q2 q+ |7 u' G8 V) v' M2 x#include <sys/types.h>
4 K) R3 }+ Q3 I#include <fcntl.h>
0 G8 E2 W$ b( V. t' n1 M
' O8 X6 B  D( l, l$ s#define SHAER_RAM_BASE_ADDR    (0x80000000)
# Y. `# U1 {: u* ^$ @% K  H3 F. S#define SHAER_RAM_SIZE         (0x20000)   
8 O# D8 T  i# \
5 H" d4 ]4 X1 Ytypedef struct3 U: V- ?' O- g
{) Y( v7 _/ `, }& |, g7 y
        unsigned int a;3 @5 r# s# w4 t) E
        unsigned int b;
# b8 O8 q: H5 {+ i! ]' B3 t2 G        unsigned int packet_cout;
  o" [9 _) a$ `; ^0 z5 z: O8 L$ l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- o- p3 B- W9 r! g3 x) E$ b: k9 ?/ G) t0 }+ ~
void read_MSG_buffer(int *baseaddr);) L2 Q; w' l" Z2 Y9 A8 F% n6 D
unsigned int count_copy = 0;
5 s$ c1 H5 a& y3 x5 X) ~5 N/ G$ {; C3 l0 ~1 `3 C* B
int main()
$ y+ r$ @: Q0 N5 Y{
0 ]6 a/ A7 H% |5 `- j! S+ f        int fd;
: @& U( G: N9 ]0 h$ i3 ]        int *mem = NULL;
: e+ z2 ?5 I) o# |8 J" _% m2 K# S, C( |" m3 U8 `% g
        if((fd = open("/dev/mem", O_RDWR)) <0)( Y2 Z5 n& B2 G
        {
# {* C# |6 }/ M) t' w. |                perror("open error");
% n0 f9 t0 z8 R  I* r3 |                return -1;' p/ p( Y! L. [, ^: L
        }
. ^1 g! a5 L8 X  _; L        
6 A1 V) e& ~* `, R        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 s( `$ I0 u& n8 s
8 X- ^; L' \$ o3 p4 O7 x
        while(1)
/ f; Y' A1 k8 I, B% c        {
6 o; B% C$ l9 B                read_MSG_buffer(mem);
) o0 i' k7 P" ~# @- P) H        }                , a4 x4 G, w1 i& d$ e% ~! T
}
; h- t0 q+ }0 f% m8 Q# y, a9 w
+ ]% Q) l- y! Y) b! r: {. uvoid read_MSG_buffer(int *baseaddr)# f+ t5 k! W8 h- v6 x: H& D" J2 ?0 R
{
, W( _: B, r, U8 J        pRX_MSG_PROTOCOL pshreRAM = NULL;3 @& ]. J3 B0 ^" z) W# |

- L1 f+ s, b" y1 p  s9 S2 u# L        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" L) N/ Y1 v. P) ^2 |
7 S/ ?" M/ t0 P- {; s& x3 Z6 w
        if(pshreRAM->packet_cout != count_copy)+ P4 m8 N* `. p! p1 p* C
        {
- v  m. w, |& w4 x+ y, J, a  I                printf("a is %d\n", pshreRAM->a);5 `; W$ F5 o) Q, ]! r9 u2 U% W2 L
                printf("b is %d\n", pshreRAM->b);
6 M$ u- V7 n/ S7 }+ s$ p  F                printf("count is %d\n", pshreRAM->packet_cout);4 Q3 ^2 _7 v; r3 Y
                count_copy = pshreRAM->packet_cout;, W, K6 v  Q' R% d
        }; _+ X- {" G) l7 N& T4 k. Z
        else! n4 ~; r2 A. m! Z
        {4 r0 D: q! g+ K  f: t
                printf("No effective message!\n");) Q- d. {5 h5 S& l, b
        }; ?3 z" ]( K; w( L8 V
}
5 Z' C) e' I' Q* ~( W( u) L5 ]% N$ N6 g; X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! h, V! g) w( Q' w* y( |0 v# v/ D- s0 ]3 ~4 {

% x0 O0 G. |8 p, c( X6 x* r. c1 N  X! r# r

& |. ^# @' q4 j$ |( m0 ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-8 11:31 , Processed in 0.042814 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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