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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 \% C" D: r  ]) C+ e3 v0 k3 z" w% a7 R- U: X; N7 L
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ k2 M9 F; v) J* s7 _* p
#include <unistd.h>
& B1 Y9 p; Y6 F  d: G#include <sys/mman.h>
4 K: [0 q- _, E, l% R" R#include <sys/types.h>
7 f1 W$ N! u8 a# S: w" ?. [#include <fcntl.h>  m: N2 G" W4 t' {+ X. |

: m/ r& X$ x0 U6 y#define SHAER_RAM_BASE_ADDR    (0x80000000)   * Q3 r5 E6 R1 B; n' K; K

# e0 {: b5 U, ^typedef struct
# O0 m3 u- \. h$ v5 \) ~0 j{  l. Z7 l: n' M$ }& V: p5 B) h
        unsigned int a;
4 Z0 K: {; F6 m) R& E8 d* S& }3 C; m  x        unsigned int b;. t; x3 P5 A! Z6 Z  G
        unsigned int packet_cout;
( f0 G7 w  {) M- ~% f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ p5 g" ~" b# R: b4 E! A; @3 f$ v& \8 w; j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; a" s/ }0 e# T' Tunsigned int count_copy = 0;
9 G0 k/ k. E& v' d2 U' I
3 [5 f. e/ s/ v' n& b: M- H
8 u5 C1 Y5 u4 v. k2 I3 g$ tint main()
1 c1 M; M9 S. ]9 \" s3 `  G{  B' z2 {7 c, k. K9 O' A; [; F
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 Q. B- f8 M9 D2 f7 p
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 f; [) w( D; L2 k# _7 f/ p4 ~+ F0 c. r; y# _
        while(1): L4 R7 d3 U7 A1 x% B
        {. k/ B- M/ g; i; a
                read_MSG_buffer(pshreRAM);
  w! Z! B+ t; ?# r, \5 c# @        }               
6 I) v9 P- P7 H  D}
; q7 c0 P0 G2 _
+ W% c) A$ O8 N# D5 {! E! q0 J+ jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 ?/ T  R* f2 e# v
{- ]! W. b$ y4 T5 U, I# b+ m( d
        RX_MSG_PROTOCOL buf;
0 [6 g7 s9 N! C0 I        6 p( {/ n- J( C2 \1 n4 K
        buf.a = pshreRAM->a;9 U* ?! D5 J, Q! O& m4 m* G
        buf.b = pshreRAM->b;4 w' u$ c- ]. B# M2 T: Z: N: o
        buf.packet_cout = pshreRAM->packet_cout;3 {& a) o% r( X( A  H
        
3 [/ H1 m# l3 W* U2 j        if(buf.packet_cout != count_copy)
* i& ^; c/ }8 x: w: L        {" ^. a" I$ S& f
                printf("a is %d\n", buf.a);% ]' R3 R% i9 I" r! Y4 }5 i3 z
                printf("b is %d\n", buf.b);' J1 u! T. {. T$ v+ ?
                printf("count is %d\n", buf.packet_cout);7 D. O$ U1 t. F! d4 w" t+ v
                count_copy = buf.packet_cout;
: R# v5 {5 `! l; F% N        }( _( x' h5 B) c
        else" K6 W/ @$ w5 |1 A7 ^: q
        {
3 F0 H9 w7 s& F  e                printf("No effective message!");! `( B) t6 v, H2 n  @) [* k
        }
. B! \% h. @" ]}$ D2 U9 U  e; N* t# z4 S

0 N- s- G( H! c; x$ |2 A# @+ l% W3 q2 M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 Y+ `# e( X# |7 @9 b! |# s
使用下面代码,对内存使用了mmap函数后:# q7 i/ t) x6 A! B( }( t6 P* J
#include <stdio.h>( W/ l  Y) a+ L- Y6 O1 [
#include <unistd.h>
1 A2 n: y( a3 [* l& w1 p% Q: R#include <sys/mman.h>( a, L  A* E& ?6 b  R  h2 q  X
#include <sys/types.h>, w7 D0 R8 N8 D- ?" C
#include <fcntl.h>
, G4 H9 {2 ~& k% X$ ^; ?9 A9 |' m( D
3 H" c5 o8 r8 ^% y#define SHAER_RAM_BASE_ADDR    (0x80000000)
- Z- h( K9 F' @8 G  Z% m- K  r#define SHAER_RAM_SIZE         (0x20000)   & k* T3 n4 w2 T4 z, t- j
! s* ?! M2 m, C  @% b' ]
typedef struct
% n- T% ]2 j& }) p{/ K& m) Z6 l5 @& W1 ?
        unsigned int a;; [* Z6 R* e$ i
        unsigned int b;
* X6 m' B) h4 h; \9 P        unsigned int packet_cout;
2 {8 a8 o* h7 ?" t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( s. h0 m0 g% O& y+ q$ |3 _
$ Q6 X; @0 U. l- {* g* Evoid read_MSG_buffer(int *baseaddr);9 g3 q7 D1 P# q( o9 f
unsigned int count_copy = 0;
  a( _+ x) l3 M" Z' Q0 H' c2 H/ I$ o" F2 `8 _4 ]5 ?
int main()8 K- t2 E$ ~; x9 n: i
{, _$ E( ^- b" ]: a: a; G
        int fd;0 G: w, q5 V" P% n
        int *mem = NULL;
. _6 W) {8 e+ p5 [+ V6 k7 A1 x- j
2 S0 P& _. W& }        if((fd = open("/dev/mem", O_RDWR)) <0)
5 Q, j: I6 b: z2 R* M+ L2 [        {" T5 P2 k5 s- m3 i' |, x' J- o/ f
                perror("open error");
, N" W' e$ t& w  k2 z) ~! S                return -1;
6 v* l. @& ?2 Z, u        }+ s4 U7 b% x; Q5 R* R; W3 f
        1 d/ p. E' T- ^
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# P  p# q" I1 N, S; y

" c7 D! g; h- m* s! k8 n9 S        while(1)) w3 x$ r  R; u. S6 a
        {
4 j  J7 E4 @( K  B. ~( t                read_MSG_buffer(mem);
4 c) S8 F! V: [        }               
2 A1 ~3 {3 @, Z}6 N. n( K6 l1 i

  a6 s6 z/ y2 U* i& Evoid read_MSG_buffer(int *baseaddr)* C  C7 M  E7 R0 }
{
+ a3 c1 V' P6 I) _7 z" I& M5 h: A: T        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 J4 `9 x0 i, ^  d4 e
  O' ~$ d: q6 J, K0 \        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 ?* _# d9 X7 x% R& N
* _; A" v3 A& b# V! N# r
        if(pshreRAM->packet_cout != count_copy)4 F- _" s; g/ r! V3 H9 ?
        {
3 K/ R2 F" G0 b  ^4 y9 n7 A% k                printf("a is %d\n", pshreRAM->a);6 R$ F: w, p0 c, F' d) C
                printf("b is %d\n", pshreRAM->b);4 C& @, l- d  A9 a& P$ a$ N& b
                printf("count is %d\n", pshreRAM->packet_cout);! C( c5 K6 d7 b7 S0 {; p
                count_copy = pshreRAM->packet_cout;3 C. b2 p; a+ X: s: `. F% u
        }
, z! }; h5 o8 C6 W' `        else
2 \3 A3 o0 L% [. Z# r: h' g1 U        {8 `# L' J# V2 E  s  [) h# r0 ?
                printf("No effective message!\n");
- ?' x$ T* u( T, H        }
$ L3 k$ q) S2 K: i6 d+ G. V  j}
. }/ [  Q# k8 f: a1 |5 o# J* z: C
& T7 J5 N9 |3 L1 b7 V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 x( N0 \; b4 R3 W( L
5 g* F# U; `) |7 S: q$ ^
+ ?4 j8 L+ C& r. V' b* `# ?' @4 n1 j& \

  {9 ~- U, L: v/ }) A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-8 06:23 , Processed in 0.039680 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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