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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   W  ?- i+ O& K4 I# b/ q
- g9 M1 ^9 Z! u& a6 t4 t) ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. W3 j- e. n6 R" Y# u#include <unistd.h>
9 o4 b. s) `: p: o. N#include <sys/mman.h>3 D1 D. j' y6 s$ U
#include <sys/types.h>
  A( ~0 o2 U8 U#include <fcntl.h>4 p" H9 T+ [* `1 n  `: b9 Q& c5 s! C* `
* p4 D* i4 J/ K  D8 }
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# s  O7 N4 E2 b/ a
  J. F( m3 m, F$ V* a3 Q" _typedef struct
: d+ ^+ S+ `0 c; s0 c+ @{
# |" _: b0 U" y$ L9 [* d5 K! t, m% A        unsigned int a;* s0 l2 m0 q4 I. L- ?$ d) ]8 p0 q4 c; ]
        unsigned int b;/ o; @3 B2 d/ l" U# a; j. l* x
        unsigned int packet_cout;
) G0 O& I6 \( A" X) p* O) G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* y9 a$ u8 q# r0 k) @+ p
3 {2 b7 q9 h# J' N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 ^% @9 \) K7 q
unsigned int count_copy = 0;
: o, W+ [2 e3 g9 N# k+ A- V: E, X! m2 l* P3 R$ E7 C

: t% {+ \! q2 Lint main()
) ~, w* W+ R" o: e% h{! A4 s3 c, P  R: p5 f
        pRX_MSG_PROTOCOL pshreRAM = NULL;" w  k( V: y* w. D0 i  k$ h
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: I8 O7 X/ _- Q: L' Q0 Q/ X" ?+ s; e/ D( a! f. A% c3 u
        while(1)& x3 ^' x) ~1 T( l3 }
        {/ L, b- n) z7 t9 ]1 B
                read_MSG_buffer(pshreRAM);, |/ L5 i% i/ F* ?* G2 u* f
        }               
6 G$ S% Q1 H! {) j}
5 Q8 v" R+ N% z- d4 Y7 {0 y7 t' s& Z# {+ R, ^& Z( C4 c" p5 X- o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- d8 z5 N7 Q4 \
{
9 q5 ^/ P5 b; f% U$ V, k        RX_MSG_PROTOCOL buf;
" @. g3 F  `" n$ U1 _& F6 V$ O6 r        % M% p& c0 C; N  c, h2 N, ~/ Y
        buf.a = pshreRAM->a;
" Q  T; g8 O: P! M        buf.b = pshreRAM->b;5 q, {0 r; Z! k/ f
        buf.packet_cout = pshreRAM->packet_cout;3 t. f- n* ~9 n4 v) Y' @3 u; z* Z4 l
        
# Y4 Q9 D& G1 k1 J# _4 C2 L        if(buf.packet_cout != count_copy)
' z. ^8 h3 P/ l        {- Y  _4 M  R1 |5 X
                printf("a is %d\n", buf.a);
! v2 h" o0 G+ p1 u- d  ~                printf("b is %d\n", buf.b);+ c+ f. ?" y5 I
                printf("count is %d\n", buf.packet_cout);* G+ g; G) n0 h4 Q" N9 H
                count_copy = buf.packet_cout;
$ K  B7 o' u0 ^# p        }
, b- C; S) Z, o1 x( ~        else
9 N9 s' \! o# b" h        {6 T0 k# C9 }" z8 \+ d3 E8 r" }9 S
                printf("No effective message!");
* _2 c; V& A( e3 ]" b        }
: o4 U" {+ W9 ~4 Q) T/ F# I}: {, x! K7 g; Q. t4 W

3 l* j# G( |! f8 |6 r" z( U2 e4 \2 y  n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# I% E6 O# }5 e使用下面代码,对内存使用了mmap函数后:( \  K/ U% C* C+ v* t& a
#include <stdio.h>: s- g2 S, U+ E- H( [1 Y
#include <unistd.h>
( U/ P# ^! }5 {! G2 \3 q. a: |8 f#include <sys/mman.h>
( @) J7 j' q0 Y5 k; M& L6 \#include <sys/types.h>! q3 g* Z* I8 Z+ D+ q- Q* B
#include <fcntl.h>
4 |: y( v5 K+ q3 Q% @: M$ j7 f! r! D6 d( v
#define SHAER_RAM_BASE_ADDR    (0x80000000)
8 ~" K# I7 F+ u& [#define SHAER_RAM_SIZE         (0x20000)   7 X2 A# R# i( q
6 Q0 u: C1 W. H! M
typedef struct$ u5 `" a. @# ], v
{
: D$ P# d# ^7 ?3 z) M) t        unsigned int a;
, I; }7 {( O9 d( m        unsigned int b;& u2 ^9 N; P. }- z) h" C& q& x
        unsigned int packet_cout;
& U0 F- O6 H: `8 C# ~3 V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( o" D' Z% F6 F1 m4 p5 J; C) M
" V  K. X& n$ a: t4 @void read_MSG_buffer(int *baseaddr);( E" ?0 P1 V$ h5 O8 v( y
unsigned int count_copy = 0;
' r! L; i; @' Q+ |! W
2 i, w/ @1 @* t  ?2 H% Qint main()
3 R* H/ U; s2 C) S8 G{
# R4 J2 A- [# @$ Q; J( t+ j' D        int fd;
. l, m" Z) w( k; {9 N        int *mem = NULL;) e6 T) r! [; L! @, a- T# u

2 i5 \4 {$ Q$ Z* m& w3 K7 l# A" ?        if((fd = open("/dev/mem", O_RDWR)) <0)  S  Q# F! D. V$ |1 ?0 v/ r$ A; j8 Y
        {$ K7 L  z# j( ~% l5 o4 U
                perror("open error");
+ k! \5 j9 j) }0 U' K                return -1;1 i" p1 C& n- |" }4 `
        }
: H* j0 j/ |& a- P/ }7 W% s& d7 N        
7 P9 t$ p4 U$ O        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& R9 z, p$ ]8 l3 r
1 b+ X* B) M& l! _/ H' l        while(1)3 Z; c" C* D, U$ D" R( v5 b
        {
- H& D7 _8 ~  G/ c                read_MSG_buffer(mem);) _( z# Q6 y4 S* d3 h4 @. `; N
        }               
" @* V4 h7 R  I; D% q}
* l0 a5 q8 k) `) ^+ d! v! c' g% ?2 H: i
void read_MSG_buffer(int *baseaddr)7 V' d1 O% s5 X
{
  p2 b  Z  e& C; T        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 h0 y; M4 T- v: w2 o4 \8 P
1 m2 @! r- v6 ]. F        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& i3 x& @. E1 M; @0 y! {

* s9 {- r. y! A        if(pshreRAM->packet_cout != count_copy)
5 A' `6 @7 C9 {7 R" k8 p% `        {0 f2 @" D8 j  u" ^$ O! W- ]  h8 {" [
                printf("a is %d\n", pshreRAM->a);
' o9 ?3 r) s' S' H) h                printf("b is %d\n", pshreRAM->b);
7 |# A! v0 [& w) X                printf("count is %d\n", pshreRAM->packet_cout);( `6 @9 H  G9 I
                count_copy = pshreRAM->packet_cout;
9 i7 U/ a3 e2 w0 g! h" F: x) @8 z6 x        }  v6 A! u5 v* ?- y! d1 N2 \" E
        else" U. S7 M+ v/ u1 C  i8 ^
        {& `* L4 o9 n5 v$ `
                printf("No effective message!\n");
2 a! G) s5 C- k        }
8 k7 K4 x  `6 _# R% f3 \}6 P" c# h) ^( p/ x: `, D
% Q2 P( Z4 ^8 ~; b: [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 s! c7 X% J8 N! Z  k5 O9 R+ Y& t) E0 e" a3 Q* ?
  ~* ~0 `9 H3 S' ~4 O- M/ p

+ u0 ^  q; R6 H  }, V2 {9 c3 m( _. F( a. _# Z% D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 02:43 , Processed in 0.056544 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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