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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % D( ?/ T# W6 I) g
/ e! h" T. [) Y8 q- D7 T1 \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  l, J* A$ N1 Z7 H' b#include <unistd.h>0 d9 H( M/ D( K: G: k0 e) V$ \
#include <sys/mman.h>
4 q# o. W8 {% N4 n#include <sys/types.h>
* q. z& X7 k; ~#include <fcntl.h>
& D$ V  }6 P8 C: R/ ~- X/ f3 J2 \
8 q# m' A- X, N0 i( |: E7 f#define SHAER_RAM_BASE_ADDR    (0x80000000)   , H7 z& H7 ^& k( x1 \4 r: T' S

1 @4 o* r7 f& |4 v6 L# c$ M6 Gtypedef struct
% L/ l3 Y9 r$ K, @4 w' d{
) v+ r! k; Z) t3 q, n! Y        unsigned int a;
4 e8 G+ t5 Q9 E9 _1 g        unsigned int b;* P9 S/ `* ]$ r
        unsigned int packet_cout;
/ J. m% Y6 P# K1 q- ]# F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% o. r" J2 C2 \6 ], W

" n& y" p( N8 c: {# p6 cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 |+ C2 M' d5 r7 ?1 j# H/ |0 tunsigned int count_copy = 0;" L0 ^. P5 u* G' C: V

- _7 B( y8 ?. N' l1 Q/ C$ w/ p* A
9 [' z3 T3 [  P) nint main()
, h. o, N1 Z" d+ q: y{+ D! W5 f1 ~8 O  v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# @+ J1 ~+ |. Y% G5 I2 [. |        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. y8 b  v* ~3 p# q5 g  u+ e  N( q% x! j; |( {, b
        while(1)$ b& m3 T! E% M+ {2 n
        {
% W" e; R; }2 E8 _                read_MSG_buffer(pshreRAM);& n8 Y$ k# i3 N) B' q
        }               
7 e5 I+ o3 S2 Y. ^7 n}6 X- L$ z0 o7 i

8 v4 f7 i( b1 ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 J0 T' ?' f3 N# T1 t# L3 ]
{+ d" G, b( v$ z# g2 ?" X
        RX_MSG_PROTOCOL buf;% p2 N7 r6 q$ y+ I
        
& b3 J6 [7 n: y# b( O        buf.a = pshreRAM->a;5 C6 u# w1 l5 `' m, D' l! h: W' t
        buf.b = pshreRAM->b;0 `; f  }: a! Q) ?( p" |$ |
        buf.packet_cout = pshreRAM->packet_cout;. J" l! D( O8 G8 ~
        ) `: ~+ A8 b( {- U- j6 i3 B4 T
        if(buf.packet_cout != count_copy)
3 |( |* v9 O- ^. B- j        {
; v, G4 C. f  V, @  {1 e( \                printf("a is %d\n", buf.a);* z3 Z5 a$ p$ E; q9 V
                printf("b is %d\n", buf.b);2 ]$ x. p' z/ [  i
                printf("count is %d\n", buf.packet_cout);
4 A1 J) w/ K7 f: A7 u                count_copy = buf.packet_cout;+ }$ R" w& G5 o
        }
+ Z: z; }8 t- P7 e0 d+ i9 `        else+ ^- @( \) ~; _" p: g
        {! S" r3 n$ {- U6 n! U$ b2 C
                printf("No effective message!");5 g# W" h; Y1 d! h) q
        }
$ ]) O! n+ R% O" D}
/ G- J3 M3 f! J- w% p) \8 D4 ]( B0 z( z; C
) U2 C) D/ J3 E/ H# B; P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; c$ k' c% W0 g) Q, X
使用下面代码,对内存使用了mmap函数后:
( W8 W6 T' M* M( z; a* Z" i* A#include <stdio.h>
% u8 X4 X; [+ U#include <unistd.h>8 B$ }6 L* R) e5 e, H( ~* ?! \  c
#include <sys/mman.h>
- b) I7 R% `) m8 M* ~  k#include <sys/types.h>" w' ^! H) c5 X! \" C
#include <fcntl.h>0 H! [" t, `3 x1 u0 b* \+ [5 l

: j2 E) i, A9 j#define SHAER_RAM_BASE_ADDR    (0x80000000)- j4 T1 I- |# g. o9 p* Z
#define SHAER_RAM_SIZE         (0x20000)   
5 D9 Q8 |+ d+ L6 W
' \" n  [3 p4 _  g& F( ?- |typedef struct
. N5 V* {2 V* w. W" ]{
" r5 A8 `6 t! i2 |        unsigned int a;; U' W- `* X; F5 C$ A1 z
        unsigned int b;* x. J  W- h, b+ N
        unsigned int packet_cout;
% ^" r! B# D; v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 W; \2 Q! f( R6 D6 C8 Q% T: O. U  _9 \! [7 Y1 t
void read_MSG_buffer(int *baseaddr);
; t; Q( v# B# o: z5 Uunsigned int count_copy = 0;
. D9 b; q7 p! W2 C
5 X9 W3 t6 w8 F3 D9 J7 u) W' t; }int main(), x0 U) j" p: w3 W# Q1 t
{* q5 Q+ D" v  }1 ^. |, q: w& n
        int fd;
- ~( D, o& L" A  c        int *mem = NULL;
) d7 j9 z( _/ \& W! g( \' K6 x) l
        if((fd = open("/dev/mem", O_RDWR)) <0)
  w# b4 y) Z8 Y  _0 J2 L        {6 O3 d- {5 G! W3 e! X. \0 |
                perror("open error");" [0 _0 k. [* I* d+ ^! i9 g" K
                return -1;# W3 n) r% b, ^: x. f
        }
" A8 B8 C* f" l6 r4 @* @        * `. }' {$ n. F1 \* S, o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, t7 ?! M* w( }" Q/ V# @8 Q! ]. t; `, p6 e9 s) c$ K
        while(1)+ N7 M/ `8 a: M, @
        {
- G. k5 }- `5 Z! Q                read_MSG_buffer(mem);
* B& Q  r, I3 o        }                ! D( X  I9 G! a% |' D, W& _
}
" K  f" y/ H; q/ [
# H5 D2 v% W4 x) ~void read_MSG_buffer(int *baseaddr)+ L5 P- l  w8 Z3 i  ]! I& S
{
" t" S- d) o  E4 t4 C# S; L2 y        pRX_MSG_PROTOCOL pshreRAM = NULL;# I* }& d# |! t! Y1 I
0 k) c  F2 N1 z6 a7 D
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( M. l7 w' r8 r/ t
- p! b! q9 D1 L2 [2 R
        if(pshreRAM->packet_cout != count_copy)" }  x6 {) [+ E+ t2 g! c1 p5 p/ k
        {
# l1 m9 j: g8 ]/ P* C5 I7 @                printf("a is %d\n", pshreRAM->a);
2 c% M. ]' T) z3 W5 C                printf("b is %d\n", pshreRAM->b);: o* n" n3 d1 H
                printf("count is %d\n", pshreRAM->packet_cout);
* E! G) ^( l' B3 {                count_copy = pshreRAM->packet_cout;
/ G& E) o' x1 H* D        }/ F! I* U7 P: {7 w
        else1 x2 M* J2 w0 k' a3 r- q$ t& |
        {
- @$ B' A+ [3 Q$ q" _" W                printf("No effective message!\n");: n4 J7 P7 b, c# w- f6 S
        }
- J$ x  q7 b* P' T& ~7 H}
- M# I9 Z0 h- d' f0 U) E& X' G
2 r1 x' x: Z, @) U6 u2 r; Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* B) O& I* N1 j- N% r) X' e: j) ~

( G% C' s' v+ K8 c5 V' _& d  t% j+ y, `" J$ i

7 L- _8 J3 A( l# \! M: F1 [( F7 C* f/ |9 N% m% S" o9 w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-27 18:53 , Processed in 0.039970 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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