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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ Z$ l. p5 h( F, C

. `  u: O: R6 U; B3 R6 A, mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! c4 t. l8 h* Q) }* J
#include <unistd.h>7 N$ y  b; }, S) X
#include <sys/mman.h>$ n! u9 ^  v7 L3 S
#include <sys/types.h>
8 S$ K: D; V  k' r* O/ |#include <fcntl.h>, Z3 w4 z8 S$ Y6 u$ y+ F# V

, ~4 Z- _$ Q0 }0 A) s" X7 W" m#define SHAER_RAM_BASE_ADDR    (0x80000000)   
( S5 W1 F+ T4 y% H0 D' N, P& H
) w8 U5 @) ?, t* }9 l0 Wtypedef struct4 E! F1 T4 K4 B  }: v& Y* [
{5 j" o- O7 Z& h0 P4 X* c
        unsigned int a;. F: [; i# k! N) |4 C4 e
        unsigned int b;& z/ _6 E' @& ^6 E7 t5 j% @! `
        unsigned int packet_cout;  O$ p( \& H% r' z8 W" v9 b- Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" N  y! v/ i/ w' ^
% V$ d9 A' ^/ a6 H& {' y& `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 C! w% {- k7 Tunsigned int count_copy = 0;9 q" W& x" B; P" y

3 Y' `8 s+ s% t* ^( m/ f! {! Y+ q( e& X+ i3 J( {5 N# e8 q
int main()
5 o, k5 B. W4 U5 K{0 w7 r5 O& Y+ K5 S# \! C/ L
        pRX_MSG_PROTOCOL pshreRAM = NULL;; p, B( m" H0 b
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 _$ d5 _# d; A3 D" v
4 l; ?6 J* E2 L9 [7 M0 q        while(1)
2 A# S5 _7 \, P) T% l        {
+ ?+ J; ]1 P5 [0 A                read_MSG_buffer(pshreRAM);
; \( o, ]9 R7 ?9 P2 r& l( V        }               
! K8 B- \6 n, V5 y) x: L}! J3 a! c- Y  C

4 |9 h2 C+ G4 c4 D" N8 ?# o, Zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) e0 I) M, v. r6 d4 N/ s4 @
{
$ B" d8 s! `9 k3 r        RX_MSG_PROTOCOL buf;
# {. C4 @! X0 n( E1 L0 W        ) S5 x* V! r" U5 d" X% Z' _
        buf.a = pshreRAM->a;1 a8 m% w7 G, X2 m( p) c
        buf.b = pshreRAM->b;
4 b" ?& K# V: a. d2 P% J        buf.packet_cout = pshreRAM->packet_cout;, \" }- h- l' o7 E9 I4 R
        6 G0 N8 Y8 B, R- e' G
        if(buf.packet_cout != count_copy)
: T/ w8 V2 p0 g4 y! Z7 }  b/ E0 G9 p        {
. S8 `/ e( P# m/ x( R& B                printf("a is %d\n", buf.a);
; F! J+ s$ q5 c( C% N9 S! x& n                printf("b is %d\n", buf.b);
1 p0 l) Z) c8 w# r( M- G4 X9 q                printf("count is %d\n", buf.packet_cout);
* Q. f; }6 k9 K( U, p% k4 e                count_copy = buf.packet_cout;
& O. _) Z; ~/ a' `7 o  f        }  t* M1 J& N& X( N
        else
0 g1 Y! ?+ {: Z- m( G7 l' f; M        {" q# @3 Z+ y& Q" x# A% S
                printf("No effective message!");
6 _* P5 o# o  Z8 v- [8 k        }2 C9 O% D- ^! m5 ~3 E! t
}( P: e  N" @; [  L$ O/ P1 F1 |
# K  b6 z6 G; A* _' O! T5 f

4 z0 K- ]; t4 u: u0 a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ A7 I9 M* y( J; a; [/ X使用下面代码,对内存使用了mmap函数后:6 _1 k7 V8 L6 A6 _8 ?0 e
#include <stdio.h>2 o! A( i1 I3 `
#include <unistd.h>3 s4 J2 n6 U* z, p' E* {' O) m$ F! O
#include <sys/mman.h>
' B) L! H! u$ o6 g0 h6 |) H* l#include <sys/types.h>( Z7 A  Z) v: I: u7 I$ Y7 Y
#include <fcntl.h>* f. B( v! b/ r" |# r
7 k" B: K7 ]1 F% |- X1 q" i! n
#define SHAER_RAM_BASE_ADDR    (0x80000000)" _  a" \% ~# Q) }( ~5 ^: z
#define SHAER_RAM_SIZE         (0x20000)   
9 U  T0 n$ I( D- P# M7 m$ K4 \, i
typedef struct
6 _# u' R" T2 c6 ?* H( Z4 N' r{2 K$ \; j9 g! T2 v) ]) `( q( q
        unsigned int a;: B. s( P% F1 J* I
        unsigned int b;: E& D' ?+ A6 _) X- x$ @3 ]
        unsigned int packet_cout;5 n- ^; Q; y7 \7 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ ?; n9 k5 Q5 w% I
# `4 Z7 p, S; Cvoid read_MSG_buffer(int *baseaddr);7 N* X: U3 _: K: t
unsigned int count_copy = 0;
, e( E4 ~) p- p  r4 i$ q+ R8 x5 k4 r5 a) F  i. w" Q
int main(). u  o8 e$ q& o. M
{7 Z) ~# P- A8 \6 u  p/ ]! f  \
        int fd;; o0 m6 \" i' d* r, j: x
        int *mem = NULL;3 K6 G9 T9 ~6 G6 v7 }! \- ^# S- T

3 a  @0 k0 I0 u* Z1 k5 A9 W% d  }        if((fd = open("/dev/mem", O_RDWR)) <0). t% u0 }! V- z
        {
7 p8 m1 C; y, Q  O; Y                perror("open error");
: G1 L8 ^8 L7 ~  r                return -1;7 T. u; e( V6 c) V- L3 t
        }2 ^( t- A3 A$ P
        
* T3 }' K4 }- d8 C% Z8 n& _        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 Z: D# r& X1 M% x
9 m, C6 i% s- O- a; y4 w        while(1)
; p$ @+ U/ N. M$ j+ E        {7 n' e/ g/ M! \. k4 z6 ^4 F
                read_MSG_buffer(mem);
, P% C5 J- h2 ?* E8 b        }                3 a  k1 O" ~- S0 x! @. _
}  H& }( X- R6 F( P2 v

5 _+ [4 K- W# E3 ^+ C( r: v4 bvoid read_MSG_buffer(int *baseaddr)
! y! l" s8 ?7 `{/ c  ?; f2 d4 s2 W! u# N+ a
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ f- }# Q  t/ N- k/ H" q0 _9 t
. v- o" p/ @# y        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% s) J: f( D7 R$ B* E- y

5 u' O# H8 t1 _4 s' [3 x+ O" H/ p        if(pshreRAM->packet_cout != count_copy)
5 P; R9 {$ g' x( U7 a        {6 G/ p0 ^& ^' G. x; N# Q5 P
                printf("a is %d\n", pshreRAM->a);
5 w# K$ I( Z& C( R                printf("b is %d\n", pshreRAM->b);
- W' x: ]' B2 [: J: N' g                printf("count is %d\n", pshreRAM->packet_cout);) V$ K  N9 F% E. i' B0 |8 ~
                count_copy = pshreRAM->packet_cout;
  o" t: |9 u# A( x7 p        }
9 c) u3 \& a1 i        else
) t5 i* E# R4 R; r) C" t, d7 k        {
) Z$ V/ U! M! a8 p% T. Q                printf("No effective message!\n");
& C" H( m; ?0 {# l        }
# e% a& G& ?  ?2 V$ z8 v7 f' d}7 b; q% Z# y4 j  i- @

2 b5 |' e& h' S8 G7 g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ y3 D) F, ], B2 B) I6 s  r% d. }4 l. _1 g' \, n" Z  |

, P7 ]9 I: f- R0 ^' N
% l. A4 p. V# D0 r! Y+ O0 [7 y! G. b" I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-5 14:17 , Processed in 0.041424 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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