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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % K/ K$ k; O- A5 F" c2 }
) e9 j0 T( M- F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ }5 B% j8 P2 `# D8 N" m#include <unistd.h>) @- v; ~. N7 n* A. f6 ?
#include <sys/mman.h>. |; s) \1 N8 d% u7 Y6 ~
#include <sys/types.h>
. _: c& V7 S3 D" [# m#include <fcntl.h>
1 p3 V8 P: `* u1 n6 C
7 X% h$ \$ q( U. B9 f#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 L: U& `! Y! y1 `% T2 s- r- a" V$ Y! N/ e
typedef struct8 V6 D3 [$ h. l* ^8 B# D
{
3 ~7 X$ a) I+ e7 ?; r/ F) |" b        unsigned int a;
& p1 C0 C5 {' q4 H        unsigned int b;
; u' n' H( k( Y- @: Q        unsigned int packet_cout;2 n# \, k$ s0 M  m- H/ A! C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 K  W: r5 z* ^; V. D# _$ J, T' V7 ]7 H9 ?! q; H: _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* B! F# j/ E( h+ B$ m1 ]' z
unsigned int count_copy = 0;  W) g$ ^$ V  c; }5 l' b

% p0 }" E$ k( P3 X* F
& k2 h% C" P* ]- s! z( Pint main()# M+ c% v& [* E& O, A
{
5 \) x3 d4 O/ K, i- ?' s8 P        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ j5 \- d" I% `        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- F% c  t4 n' O3 Y) v# M8 t

1 v$ N; }7 I( {/ x        while(1)# F9 ]( z. \: x% C# U
        {4 Y5 r: C" e' L. I0 o2 w( j1 M
                read_MSG_buffer(pshreRAM);
4 Q. y+ a3 H. W. z  O- P        }               
, }4 s& C$ i+ Y. W9 O. h% U. y7 t}0 x& D$ S9 x( F4 e
7 p% X7 U- H( s! F  _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 K6 k( a  ^; |8 ]5 K5 Z2 x
{$ ~- `! I$ B+ S0 a" i) o) _
        RX_MSG_PROTOCOL buf;. j. K0 r7 q: Q! K
        
& A8 u! }5 |  Z' K: ^- ?, E        buf.a = pshreRAM->a;
2 g7 X' M* f1 A        buf.b = pshreRAM->b;
# K5 s" Y% }1 M, A- p        buf.packet_cout = pshreRAM->packet_cout;3 z$ S& _/ ]6 A
        
# R8 Z0 Z! Z# `" K- i( |& d        if(buf.packet_cout != count_copy)
% Q4 P7 h' |) G3 ?2 P& Y2 I" [        {
% H; y. {# k3 W                printf("a is %d\n", buf.a);9 S2 g. e# ^+ y/ x# |4 ?' n7 j
                printf("b is %d\n", buf.b);
8 J2 @2 H5 D) D/ s0 x* [                printf("count is %d\n", buf.packet_cout);( l4 t& v( v4 \5 U7 Q" X7 z( m0 o
                count_copy = buf.packet_cout;) ]% `+ e! H6 _8 P; h
        }
9 I; o9 e: M, u: w        else) T1 e: P4 G& k: U+ Q/ D
        {
& B: g9 V% Y9 y" u% G3 i. x: R. G; n                printf("No effective message!");
( W6 M3 Z% j3 ~' S  Q        }3 M" d8 ?+ O3 H* U1 x( G6 l( |
}
$ y, F0 C$ x6 {" T' z: v, j! V
' Q+ w: A( Q" V
$ q  b9 N# j+ q2 Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ X* M' d; Z5 p2 T2 T7 [* i- P
使用下面代码,对内存使用了mmap函数后:3 F) a: k) Q2 Q7 Q& C9 o; ~
#include <stdio.h>
# \1 B4 a9 d1 |5 Y#include <unistd.h>
' n+ x4 A4 E! f6 r#include <sys/mman.h>
2 a: H& d1 H8 j. w/ B  p#include <sys/types.h>
. t. H9 s2 C% n' v#include <fcntl.h>
) O5 P" b6 n. h8 _0 T1 d0 E0 \; p& g' p, U3 a
#define SHAER_RAM_BASE_ADDR    (0x80000000)
  }, M: l( Z( c$ v#define SHAER_RAM_SIZE         (0x20000)   " A. r7 N$ ?5 H4 ?3 H
' G) a1 y; b, p* k3 \
typedef struct( i% e( i' v9 E/ L
{
& t3 q8 Y$ W# g. u        unsigned int a;
& ?! w$ Y8 W& z; o' I5 X        unsigned int b;
# f2 g. v* u/ Q* L' y7 e) M2 U3 I        unsigned int packet_cout;, j; v# t) d" j/ u" c- O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& a! l- I5 B) K, H2 I
$ t9 v" m: O: C( A
void read_MSG_buffer(int *baseaddr);, t8 ~* O$ M9 w9 M7 R
unsigned int count_copy = 0;2 W- z* b4 W7 L6 q9 E7 a) o
5 \! F* m9 k. e/ X6 g& H7 P
int main()
8 h  Q* Y3 @9 w4 B1 B{" D6 w0 H5 T5 A; P
        int fd;& X. C& B5 g  V
        int *mem = NULL;
& S1 E, c% f1 A+ L6 C2 N; L6 f
! ~0 @  U. G% p* W: x- B        if((fd = open("/dev/mem", O_RDWR)) <0)
% a% F2 l  K  h6 t: ?. A( Q        {
+ i0 r, ^: @  h; ~4 X                perror("open error");& q: w; O3 B1 \8 L: d- d9 b
                return -1;
& M: d+ M  j. e: [% u0 ^        }) e7 j+ B( U& n2 e$ U3 j& l
        ( R. g( a6 z9 V
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, r  B+ ^& J6 Q9 c) Q0 h
" ]3 H7 d# x7 I        while(1)
4 j5 o6 _) f- C0 j; d. g' G        {
, U: Q" Z$ C3 t+ S! v1 e                read_MSG_buffer(mem);* r) X) c. t, |4 V5 {1 g; M$ f
        }               
% U# r$ M  U! }! z. d% s6 X}/ M* Q+ `1 m7 z# @1 V: M- T' w

3 o9 q/ U* @8 yvoid read_MSG_buffer(int *baseaddr), V( [9 U) N; ~5 x1 _. T
{
9 X8 b( X6 e$ l! W        pRX_MSG_PROTOCOL pshreRAM = NULL;2 D- W( w  {, y% [* R/ N  Y

+ ^9 [" v' a1 ?% B) a        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 k2 t4 v7 i6 ]% H8 f# @+ i
" ]- B. Q. M6 B- a& `
        if(pshreRAM->packet_cout != count_copy)( W; E+ k4 A8 I9 l' ]  F+ o5 {6 y
        {5 U# e, a: ?* K* R+ _' Y6 H- y
                printf("a is %d\n", pshreRAM->a);
) @4 P2 F- D- {/ B) X                printf("b is %d\n", pshreRAM->b);7 S* k( v5 Z1 m
                printf("count is %d\n", pshreRAM->packet_cout);
) S; Z$ z: j4 U4 S- t                count_copy = pshreRAM->packet_cout;$ J' g) M# l5 W0 D) s3 k
        }0 S; Z, V# y8 s% I; p6 l. K
        else) r2 Q$ ^: u5 ?6 E
        {
8 Z$ m; ?9 z( }  y5 c: G                printf("No effective message!\n");
: n  v! E7 X) o) s+ a4 F, m8 ~        }& f1 N- N4 B6 m! D7 Q
}( u1 _& x; `1 ^/ m8 }; g

0 B2 J" v7 P, O: E$ l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 ?! q- h5 |4 k* N1 ^$ a9 Z
/ Z2 O8 u% E' I
) B) A0 N) H9 x
" }0 u/ G3 H6 v& O9 Z0 {% l$ ^" ?$ Y- r2 w6 e7 v+ }( }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 02:13 , Processed in 0.043468 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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