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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( g5 v6 h( Q8 C1 L
3 l+ p9 j: d3 c# S( r( iOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" f/ ~5 u4 I0 }, g% ~#include <unistd.h>
* {9 p' n: a" T9 m* x+ O4 T0 z#include <sys/mman.h>7 ]$ e8 K6 |. H, G' k0 D9 I0 R
#include <sys/types.h>3 n6 ]& m8 G1 N
#include <fcntl.h>
' R( {! Y1 P, D
! g- F0 Y$ h# J6 ?#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- I& Q7 U$ E( `, ^# g; \6 G2 {  N" D5 N6 S. m6 ^# {: B/ N6 e
typedef struct2 c: [8 p& S6 ?& r. F- g
{
8 {7 X1 s% c* b4 u        unsigned int a;
4 D1 c0 u) d& d! C. l7 o        unsigned int b;$ M; a8 `8 r1 v- Q  K
        unsigned int packet_cout;% Y  J/ P* A' R! |& J- \5 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 m' K1 i, H2 i; p2 D  Q

. @3 S  v* P+ i/ w/ J" ^* @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 |9 B8 c$ v! V) o1 h  n% o
unsigned int count_copy = 0;
3 Z  ~* F& I& |5 O- {, W5 n5 P3 f3 n9 A% \

1 ~  p5 v! N' }' v0 B9 jint main()( w1 ?% L9 C( |& u7 @7 M
{/ b3 K8 }) Y) D$ s4 c; ~* ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ Q. @. u. Q1 [# L( P: @
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# ~3 U* Q, P; w& Q  K
7 _! L) v8 _) \/ K% B4 R7 |
        while(1)
$ X+ }4 I' [9 p( @        {
  t2 K& ?) k+ g- _, S) p                read_MSG_buffer(pshreRAM);
$ v, w9 a* }1 s- {7 P! v        }               
1 @. W8 g/ G3 P; e4 n6 d- P4 ~}; }3 Q3 ~4 o8 F7 b( S
5 {: _; a, [1 R3 s2 _1 C% Y# {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 R" h" B8 x6 o! l
{
: @8 }) [/ e  o        RX_MSG_PROTOCOL buf;& h# a8 U% g; p9 k$ j
        ; H: u, V) }! [! ^: x" \  }
        buf.a = pshreRAM->a;* J% o+ \7 B- W, g: ~1 L
        buf.b = pshreRAM->b;
( {& \' a* h- b3 w2 d+ l        buf.packet_cout = pshreRAM->packet_cout;
- y, h0 j% t( z8 D9 I2 X+ ~# |- r        . h6 Q8 X: F2 ~8 N% L9 d
        if(buf.packet_cout != count_copy)* R' x4 U7 h9 ~! E# H2 ~7 @* M
        {
1 Z; b+ M1 J4 t) M. ?                printf("a is %d\n", buf.a);. m4 K# w! ~0 P& w8 K, C2 Z
                printf("b is %d\n", buf.b);. i; m! ~' Z& s; Q2 V, ~8 G
                printf("count is %d\n", buf.packet_cout);
; t7 N' y" v4 V$ ~; L                count_copy = buf.packet_cout;/ K  X) y; q- U" k7 V- G9 p  m. J
        }
0 v$ n) g  x3 s" k/ e        else2 i5 L9 G; g/ T; c
        {
+ Y9 h" @! ?' u1 p                printf("No effective message!");
8 S+ l  Z% I, a% R        }
) O" C+ q( n5 K0 P1 j}
9 Y% b% _: P' ?% S3 ~7 F1 @) v' X" C, R

' a  F) Q" b% g% Z, ]但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 v! S1 y# C7 ^7 \, `3 W6 w7 z使用下面代码,对内存使用了mmap函数后:1 i2 ~3 W+ \% M5 `7 `9 H" j9 h$ g
#include <stdio.h>7 E8 E+ d6 s/ L/ h/ p( n
#include <unistd.h>
8 S+ K4 B% Y7 C$ s  @#include <sys/mman.h>
* x3 ]8 I5 Z9 P2 j  ~#include <sys/types.h>; M. Z/ a0 ^- n* f# r; A1 X( ]
#include <fcntl.h>
6 h8 w! A) g3 F& t
: l  X. r. \: P4 R#define SHAER_RAM_BASE_ADDR    (0x80000000)/ |/ b9 p9 p9 V2 l! b9 D
#define SHAER_RAM_SIZE         (0x20000)   
1 R& I- F. z; s" M* d( O" Z
1 R: u: `- B1 Q& w" Qtypedef struct
3 l* @9 i: }* s# t* `$ f{5 I9 z3 L, w' Z8 t* C
        unsigned int a;. c8 S+ g+ Z3 @) T$ [
        unsigned int b;
- Z1 M7 \7 r  Q/ P- ]4 e        unsigned int packet_cout;
7 N* y* a7 ~. j* [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ D6 U  I' L2 h, _" W( {
- B# [7 d' f% L# t8 L: R2 `
void read_MSG_buffer(int *baseaddr);& _: ]8 B, l& T
unsigned int count_copy = 0;
0 g6 i3 X* J. W* X# T2 p& ^0 G/ o
: l& V4 R+ R4 z3 Dint main()* {4 T) d5 T% K/ g
{/ ~, i) Q4 W8 l# `( X0 U; w
        int fd;
+ ?" k. W; \( A  K! Z2 x        int *mem = NULL;2 a' @; }3 W# c: H7 q( A) E
; k" b+ D) @/ X
        if((fd = open("/dev/mem", O_RDWR)) <0)
) z( Z7 o, V4 ]% L+ c* R% c        {
1 k! C2 W+ Y7 E                perror("open error");
9 z$ w+ c# z/ s+ V) `                return -1;
1 U/ }" O6 K6 z; x* G        }% a: d7 y* P% p) X( A+ N# d
        % n+ G8 A2 p. J* Q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& N  s! S  p3 c$ ~/ u" e
, w3 a- n# y7 h* y5 q
        while(1)
( j, x5 N% i8 Q        {
8 |! @+ ?; u4 V                read_MSG_buffer(mem);
7 i& M! c/ B' i3 M9 o; A1 @! M        }                  h' c$ D- b+ z% T
}% o% p8 f3 U0 e" q. t
; w0 r* [9 d" R+ J. M; ?& F' _& a+ _
void read_MSG_buffer(int *baseaddr)
6 n1 L4 n, N6 g- I) X4 s4 M& J; v% Z{5 q* c4 B. F1 w
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 p0 r8 W4 G! n* B4 p
" I& R" R8 m* Z. e; n9 y0 }6 r
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. ^! e1 \0 y: k  |

! ~$ l" J9 l% z4 E4 K( k* m        if(pshreRAM->packet_cout != count_copy)% U* \( Y- M! j6 E6 @
        {
. A: m2 m7 ]* a/ y                printf("a is %d\n", pshreRAM->a);1 {) H' v* Q. u" k2 [0 B
                printf("b is %d\n", pshreRAM->b);
/ h, P1 c! i" I: ]% W& `                printf("count is %d\n", pshreRAM->packet_cout);
6 `8 O$ w! D' c- U( v8 j                count_copy = pshreRAM->packet_cout;
0 m9 f1 y. t7 X$ e: X        }
, @8 ^) c5 j2 {: [: P3 y3 V        else$ W4 @5 N# b) I
        {2 p# _2 |1 N1 R$ @, S  w
                printf("No effective message!\n");! Y1 ]) q5 b" p! b  c
        }0 o( D, l; z) z0 S
}: p7 O# M4 ]( p9 }. }

! t0 d! t. P9 g5 U$ z+ t没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: V, Z* k8 {+ y9 ]2 _+ t+ C4 S: ^% Y  l5 ~% s* K/ [. b9 X

* u- G, g# N0 K* w+ t/ B  P3 o3 v' A7 N; P9 O  g
$ Z. M5 U2 |0 ]3 f! n& I+ m8 N3 u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-8 07:34 , Processed in 0.039237 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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