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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 S( k8 M5 l% O- s
( Y, j- T, [3 n7 DOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* q6 k2 D9 P& c( U% C% P8 W
#include <unistd.h>
: E$ J' S( r4 U9 @#include <sys/mman.h>
, x" s9 P; T  h- i#include <sys/types.h>$ }5 P, t, M& N7 P: b
#include <fcntl.h>
+ m) Q$ d# Q) M$ u! g
4 p4 n1 @  \5 H+ ]# M#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) U2 ~- U5 b* U0 P: [5 B8 c2 o" V* s' y* t* j/ @/ D
typedef struct
; h& V- r( ?/ J! C/ f{
1 S# k4 M" J2 c% u0 d  I        unsigned int a;( V1 p1 t+ K% {3 X; Q( ^- j5 u( j/ Z
        unsigned int b;
1 M4 ]) }4 ]: V: P        unsigned int packet_cout;
& y+ r2 B% ^3 x5 y( F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 H  h6 U0 E4 Y4 Y6 w3 X  k! v" ?

/ d9 U# d# M4 @$ uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 N* D$ z: `4 N( kunsigned int count_copy = 0;9 n- y; F3 S: w: C* Z1 _

; I2 b" Z% H9 m' p0 Y6 p" ]* a/ w
. n) b: g$ x  }3 X5 mint main()4 G3 Y3 d. n8 @0 F* f2 Q
{
/ x- K2 {/ V9 ^* u" i/ E# d        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 S$ r! P* i7 M, M        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( k) L3 \8 F+ U! \% b# b, d
' \- p# E) i2 ^% z, }        while(1); c; |0 ^6 k- O; o0 d+ k1 I& R+ N
        {8 v$ ^. {4 O3 E* z2 g6 m
                read_MSG_buffer(pshreRAM);1 Q( D" H) p, s5 R- z
        }               
( K/ w) G% ^! U5 _, d) _' f" Y}& z3 \6 L8 H( z/ j
7 |$ W6 m3 k. h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& o3 H. k! P8 @7 F+ D* E6 g
{
- b" ?: w5 d' _9 `        RX_MSG_PROTOCOL buf;
& V2 a0 K2 J$ b2 @8 Y+ t* U        ) K# I# Z/ d* X2 c# \# W
        buf.a = pshreRAM->a;
* D; K4 m( v! v        buf.b = pshreRAM->b;
( Z. o1 p- x/ Z4 P  t        buf.packet_cout = pshreRAM->packet_cout;* b4 {/ n% @) p6 d; j
        
# W) }( C) ~8 |        if(buf.packet_cout != count_copy)
4 w" |! d0 U3 O, ~% _7 C, ]$ ?        {* S" [& y& a5 A; n) p
                printf("a is %d\n", buf.a);0 i& M4 A) c& k* |% q
                printf("b is %d\n", buf.b);" w- t+ g. ~# \! L! r5 g! b
                printf("count is %d\n", buf.packet_cout);
8 K/ ]$ Y% j% i3 z( B6 X: K$ r' u. n: q                count_copy = buf.packet_cout;  r  o/ L" t2 e
        }
' C3 {$ J9 @  v* L1 V+ Z        else) W/ K% T' \( F7 q
        {: f& g1 N1 {5 J2 w
                printf("No effective message!");# }- O5 ^8 Z0 W7 t; g! z/ F
        }/ c+ k- n" @2 f# L) S% z
}
" f) |9 ~" M$ j& }7 O* ]$ T; I
: ]- z% ?3 s3 M0 r8 M% O) R/ I4 L9 N1 Y0 T+ {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) c' F' k5 Y) [) A8 u5 u* J使用下面代码,对内存使用了mmap函数后:
, O; Q; t* y  r: G! @# Q#include <stdio.h>
" `, m" ^: I% O#include <unistd.h>
- t# T% |3 j1 H" m#include <sys/mman.h>( v: L1 @- i. o1 W
#include <sys/types.h>
2 w  \2 p+ b9 f; R2 T#include <fcntl.h>8 |- r& p) i6 ^

2 o3 B, u0 R/ [% @#define SHAER_RAM_BASE_ADDR    (0x80000000)
, K0 u) C* J6 r3 S1 H#define SHAER_RAM_SIZE         (0x20000)   
' B: b+ E3 \; H9 _: R
, T' C; \' z' F& ?- j" Ytypedef struct
& E3 ^1 _& H2 X+ ?: y0 q{
2 S# g* {2 H& B, e" D/ O2 F- g        unsigned int a;
) X& `3 H# _2 r$ }7 N        unsigned int b;
' S* P- k! P; U9 G: i% I' t        unsigned int packet_cout;
+ `0 `9 x6 Y# p$ r* w0 l7 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 k. p5 V+ G+ s( v2 t" b3 k' y' W" `8 d
void read_MSG_buffer(int *baseaddr);
  z7 ?' T( V& g# m# X) Sunsigned int count_copy = 0;
; q+ @3 ?7 j5 g0 y0 B
/ Q8 I( q# `' q3 t4 V9 m$ f8 Iint main(). _& Z- X5 X2 b5 m2 R0 i. G
{7 Y/ x$ b7 o8 N; Z8 j
        int fd;
' ~7 [+ u; e5 L1 A: N$ i        int *mem = NULL;
! o( H) L. x( l( A7 }% R9 W1 T  Y2 L( U9 b* U
        if((fd = open("/dev/mem", O_RDWR)) <0)3 e+ ?( |0 l- \. r
        {
" I( d1 ^) N2 z% o9 h0 Q6 u9 V+ m                perror("open error");# J8 p) C. A8 ~+ b. e* d
                return -1;  w" E  d7 m$ H
        }( V, p* Z3 h% }% c
        
& x' K7 |) l' x/ w+ ?1 _2 s        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ [( X8 K' S) V; N+ d
# W- E; v7 z) c2 r% C
        while(1)/ K0 b6 n- Q: C" a
        {
& i6 L9 q1 s2 V3 H3 Y& z# T                read_MSG_buffer(mem);8 o: k8 l+ U: i6 L9 f* d
        }               
. M$ T* P  H/ J% A7 d; g- ~4 i" |}4 ~# z: D3 K4 H. ^" K
+ c& N1 C+ w2 _. n
void read_MSG_buffer(int *baseaddr)/ U6 g2 M/ O0 u, H9 T
{
$ s+ g6 k$ L! H# ?* h        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 N& X( n9 p- L
2 Y; Z" j2 Q* O# u- ?6 h        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 X' G% F) v* g& D! o4 w7 S/ l6 h, t9 C6 b% K0 R5 ~" [- w7 X
        if(pshreRAM->packet_cout != count_copy)
+ O4 z# j: ?$ z" F        {
, W% R3 @" R; A- y6 A4 W                printf("a is %d\n", pshreRAM->a);
. m) t. e' S- e" O. e1 e& |                printf("b is %d\n", pshreRAM->b);
+ _& O: F' @( _: N# U/ [1 v                printf("count is %d\n", pshreRAM->packet_cout);! E! X! w0 |$ Q5 U. x% C  L+ w
                count_copy = pshreRAM->packet_cout;, D) v/ d/ w$ X  g
        }6 C, n" x5 a: \2 Y3 |3 ^  r' P4 D
        else3 O; O/ d6 r, j2 _
        {
3 l3 x& h: L9 r                printf("No effective message!\n");
7 n' O5 K6 P) A5 M# A        }9 L8 o6 L. y( D7 t4 P) F* O
}
) [+ }+ q5 `& I5 v- o9 c( T* o& }' s. K: q/ \# L9 l6 H$ _) z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 R' v, C3 s* L1 O# U- `: q& K; u7 v+ P% e

# X$ S$ w3 D/ R* R( t$ W  D( n1 E. U( k; F

: u; q# n8 s$ o; Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-24 11:49 , Processed in 0.047791 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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