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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ x: H# M" d2 l3 u9 \- f
7 W; Z7 C0 L3 O( ^OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& `1 U4 R. _7 J' p: F  R$ V3 _! N9 P#include <unistd.h>0 I( b, X! t( G, A, [! Q9 U
#include <sys/mman.h>
# o, H# Q1 r5 i3 \' V0 [" ?& p#include <sys/types.h>+ u: b, O+ L/ W& F9 ^: _
#include <fcntl.h>
$ y& @; c9 G# ?8 E& z
  ~5 H3 @) ?/ p; O, O( K#define SHAER_RAM_BASE_ADDR    (0x80000000)     Z; a9 l; U! k
8 h0 t8 E  C  A2 a
typedef struct
9 O- |: K. l2 R& a/ x+ u{
0 N/ x" Q3 d# R( |! o0 ]/ k        unsigned int a;
9 s" o/ q2 s# s; k! V' p! _        unsigned int b;, l; B2 e* R7 @- d
        unsigned int packet_cout;
0 V4 Z  |% j7 s( E9 g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ F0 j5 R" J% u+ w( h
; ]# J3 w9 y& X- ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( g+ @( M! v7 a" j1 U7 Bunsigned int count_copy = 0;
6 w; d  |1 n# L4 |- ^* D  P" Z
1 ~0 k3 C& ]: {* O9 ]
; \" s) E& k* e7 O1 }int main()
/ L5 n5 \' B6 I1 m, v{9 ]( P% H0 [' i9 ^& p2 E
        pRX_MSG_PROTOCOL pshreRAM = NULL;; C7 j8 ]9 d# y. u, G" n* T
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) }: {8 H" ~: L0 O8 O- a
0 P* A; q% c* n- u5 o
        while(1)' i$ r9 D6 i- z7 `& ?
        {
5 i# e) Y7 v2 r% K* s; a! ~                read_MSG_buffer(pshreRAM);! u9 t  m# s) C3 p
        }                2 k* i  M8 e0 U! W' T; z
}
9 U% c" ]% _/ G+ ]& }& t* l# x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 Q, x2 T; k4 S2 W
{, p( A: u/ z! }
        RX_MSG_PROTOCOL buf;' Q& k  U+ {. s6 h6 p' L
        
0 W% N7 ~" o) K# R. K- `        buf.a = pshreRAM->a;/ U3 L* S% S- @+ `9 r: E$ G9 W
        buf.b = pshreRAM->b;
' f* R1 e* {# _5 B8 M, y" |# f8 A        buf.packet_cout = pshreRAM->packet_cout;
2 E2 A$ r% T7 B- Y3 x* `5 p        
! D2 e6 [1 f, ?+ n        if(buf.packet_cout != count_copy)
5 p( X2 F  h+ i) k8 b9 V        {# A- d& h0 y( M' O: ~) \
                printf("a is %d\n", buf.a);
4 {1 U3 b  B) z7 L  y( p9 ~                printf("b is %d\n", buf.b);
* I! P/ |* ~* [9 C# ]; R2 w                printf("count is %d\n", buf.packet_cout);
! R2 S% b' V6 N+ W                count_copy = buf.packet_cout;
5 ^( r5 \0 d  s: C, y; `        }
2 I* X* U  R9 r& m$ w        else6 Z- K/ L7 N1 C& B$ f7 i/ {
        {
& _4 ~; l) D! F" x                printf("No effective message!");
, S( R5 I' Y3 h( _- Q1 O: P        }8 ?+ H  h% `% u" e3 t* n
}
. [/ F4 w# y3 M) l: k, @
" {2 k1 _: ^. H1 l  G3 b+ z- N3 H; q4 ~& g4 O5 o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 @4 r6 r* S* z0 N& Y1 O) @1 x使用下面代码,对内存使用了mmap函数后:. V1 O- |8 z; C+ a- P1 Y
#include <stdio.h>% f* ~* d1 A6 Q
#include <unistd.h>  s# n  m+ V# _
#include <sys/mman.h>
! K/ V0 Y  l) H$ }5 t  d#include <sys/types.h>8 f; _% {+ J! w  }
#include <fcntl.h>
+ A' B3 |% X  b0 I4 t( k+ U+ g* a8 g5 D+ s
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 j. P  J5 k: j- G#define SHAER_RAM_SIZE         (0x20000)   
2 d: X6 I2 Q5 ^; \; @, e* `! i; \4 W1 m; I% E" p
typedef struct1 }3 r8 T+ x& k2 g2 A2 A
{
" S* j9 T+ g3 }: P' w        unsigned int a;
) g* J1 _( \& a7 G  ~& \. l) c        unsigned int b;
' r2 c0 _2 {& L" G        unsigned int packet_cout;
5 H8 Q, N  ]# S) E# C3 v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 [& `) @6 }; a4 z7 B! A) L

- z/ c9 E! \2 W& o3 w) Ovoid read_MSG_buffer(int *baseaddr);8 H2 _* o' ]: R2 ]  C
unsigned int count_copy = 0;6 {1 n; n! _( d# E

3 B. X8 e9 E: P5 Fint main()
' k+ }  j3 k$ I8 t  m{- g0 P3 m- ]( F$ [
        int fd;4 c$ L& F9 K2 b' H8 F- H
        int *mem = NULL;6 X. b7 h. ?; \1 u1 `7 e& G
. X$ a5 ?6 k5 X9 J( ?8 u: V3 E
        if((fd = open("/dev/mem", O_RDWR)) <0)/ ^0 @- S" u6 w7 l
        {
% M8 U8 |. ?+ @% O' f3 }& N                perror("open error");
) x8 h7 v/ x/ Y3 E1 V: J' O- |$ S                return -1;5 x) q0 M1 N- Z
        }
& J: G/ \+ [& T0 `        2 \7 j. @! g2 ]4 m, N4 r
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 ]) |, E/ B6 Q% ]

/ z8 R8 t9 ?. L. E+ _! y0 [        while(1)
0 t, }+ F" W; g' o        {/ b+ ]1 I( W4 S9 J
                read_MSG_buffer(mem);
. Y9 P' e" C! C) I; S        }               
  g+ R  z% w% ?8 {2 ]8 ^}
2 N' e: n$ z3 P" d0 Y0 S" y3 |
- }8 m* F/ v0 U% @; S* J" h, Bvoid read_MSG_buffer(int *baseaddr)% V7 X6 s: H3 k7 X+ I
{1 j* w5 |+ l' s$ B$ B% e; l
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 G# m) w7 d, ^' U; S: s  D" B

" d; m$ X8 n8 A0 Y/ D        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% g' j- x1 }5 b, k
  `: v$ R1 c1 P  e/ m& l' S: E
        if(pshreRAM->packet_cout != count_copy)
* j/ M" e& d. d, d        {
, J" Z( D  R2 f                printf("a is %d\n", pshreRAM->a);
5 l9 p  |! D- e+ y0 s                printf("b is %d\n", pshreRAM->b);
  s, ]5 O5 o& M  V: V7 ?* ?" M                printf("count is %d\n", pshreRAM->packet_cout);1 D. E/ H9 B: Y
                count_copy = pshreRAM->packet_cout;
* G7 d# |1 P% e. q$ K$ r, y        }4 i( r" N6 y5 ^( H1 _  \# k
        else
3 z! P% L2 O  R! E( k; I: z        {
$ }6 g4 p  g2 {* ?3 K                printf("No effective message!\n");
2 ?" D" e+ `: I9 S8 E0 ]: P" V6 e: B        }. \$ {! ^" U# d2 _
}
9 y7 r# _; M5 @4 }6 B- U- J
% S, l- ~' i) L4 c+ z/ m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: g+ Z1 ^# c0 r1 U9 Z
8 c4 S; X6 q4 x' r# e0 o2 ^1 ^1 [

1 \" T8 m4 h, J0 ?7 j+ l% r' T' [0 Q8 R. s9 f

; e7 p$ p. n( i! A* M, L* g7 i/ J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-13 05:38 , Processed in 0.040934 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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