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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# g/ Q3 w! z% m! t& _" H, f1 {0 O( A/ S9 ^9 v: |, ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. M' L0 h" O4 }, c  d0 p3 U
#include <unistd.h>/ C3 |" k- |, y9 h
#include <sys/mman.h>
: x+ g: T$ ]. B, D; ^0 n#include <sys/types.h>' N4 \4 S4 \" |- }2 D
#include <fcntl.h>! ^! @0 k) n# L/ h( Z, |
) q* T3 n8 r. p$ e* d% ^5 h* G% `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 C5 \# g9 M% v5 i1 x9 i
1 f9 ^" S  z. ptypedef struct
  j6 O* i2 k# y1 |3 B6 U{5 L8 v' g' @6 W$ ^, g. K" m
        unsigned int a;
0 u2 k: ~/ f. c7 O" y        unsigned int b;
) l7 h& E! Y( J$ Y        unsigned int packet_cout;9 u) K5 {6 {+ M  K4 p6 F% |3 m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 n4 o7 R5 i* K
- U- O0 f, N  _4 I+ R3 E# E3 qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# T! E5 F* `  B# a
unsigned int count_copy = 0;7 Y4 H# R# @. M* m/ \. l$ V

. R, L3 k. f, Y' [" O
0 t4 P2 n. x7 T* o$ n: }int main()
  b! S# H5 V: }" ^* a$ |5 j" s{: Y' m, c) Q& X7 [! J' n6 U) t
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 p* n9 D' f: U: C4 m7 }8 w        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 Q: U( A$ x" e2 ]# j' n3 [

4 g) @4 Y1 e) O6 u* k) h+ N2 k        while(1)' I5 e) d* F. P4 p
        {" G: y" ~; C5 |# r' ?; U1 b1 E: t0 M
                read_MSG_buffer(pshreRAM);% U$ P0 M% k% Y9 b' \
        }               
9 q, U4 h# v" ~- R' f( y4 J+ ^- V}% S+ _: I- o  Y% l* _" S$ i* S2 [

/ {, N2 Y7 T. svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) a& H2 [2 a$ ~# [{. k6 l/ A9 ~/ o
        RX_MSG_PROTOCOL buf;) `. u/ |2 G; R
        
$ n/ d+ N4 a$ q4 k; i% q$ v1 L        buf.a = pshreRAM->a;  c+ K& z7 v) D: X$ O* C
        buf.b = pshreRAM->b;
% y1 d) H/ e* _# k6 z6 f- \        buf.packet_cout = pshreRAM->packet_cout;4 k& P% c% |* S* T
        8 x0 l6 M  c; v) H2 _: w: a: X
        if(buf.packet_cout != count_copy)1 }4 ?- F' O. k) `
        {  z, P0 v: X+ `/ K: O
                printf("a is %d\n", buf.a);
7 a; i4 p( ~3 R; e                printf("b is %d\n", buf.b);
/ ?0 D8 w4 [; w( V  i$ G                printf("count is %d\n", buf.packet_cout);* B' C; x- c9 M, Y, U8 j7 q1 r
                count_copy = buf.packet_cout;
% ^3 C  i( P8 {+ Z" m, \        }- T5 Q2 `- V" c- Y4 Q8 u
        else, {- J1 E: g2 ]+ S% E  L! H
        {
- e5 l. u: ]8 I, M3 G                printf("No effective message!");6 v, l3 B: N6 |8 A( |, ?- J0 l
        }
- V7 Q! I4 u' P2 K- H$ z5 X$ _9 g}
) d: l9 ^$ a  l* a: {* [0 x( u
7 S# t; w4 ?9 L% R& H: n. S( ]& g2 t- R4 \: x2 a  I- s; t
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 ~: g# o  L9 s3 j: @* K使用下面代码,对内存使用了mmap函数后:
8 k/ k+ B7 L6 X+ D/ E- Y#include <stdio.h>
4 M, r! O, c0 w7 \  G- V9 T0 e#include <unistd.h>+ N# x. f* e4 b! z
#include <sys/mman.h>
0 Q6 s' y. R1 |) S# L#include <sys/types.h>
, L9 E2 E; @9 T* C# X+ e#include <fcntl.h>
' E' i0 q$ K2 B+ M
) r9 i$ ?& Q0 i3 e3 w#define SHAER_RAM_BASE_ADDR    (0x80000000)
% V2 h; e  n9 p0 z$ ]- }#define SHAER_RAM_SIZE         (0x20000)   % u- H4 S6 V% A! A1 T7 w: s
( W8 D: \- w" }1 |$ S) k* L! X
typedef struct
+ w6 h. b1 _. R: y) Q, D5 K{6 y+ A+ T4 e5 R/ z# Z- _* O
        unsigned int a;4 N/ y, W3 x/ j4 P2 F7 W
        unsigned int b;1 p+ C0 E, {4 }: ~; b+ o- z0 c% }
        unsigned int packet_cout;
( K, c- C  W1 |5 w) ?: [3 G3 Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 Y8 s8 F. c) J0 z1 \/ l+ M+ U

  D$ b$ }, a; I# o2 r: }& L- Vvoid read_MSG_buffer(int *baseaddr);( }' i7 W. K7 ?3 H8 L3 D
unsigned int count_copy = 0;
; S' N. Q# @% N4 k. {; Z/ ]9 b( D& ]4 E. S
int main()
1 h# L% f5 I/ o0 J' u{
" Z! k( s0 s  J/ M8 G3 ^& s        int fd;0 |0 ?- L- y9 o$ T7 y( L  m9 U
        int *mem = NULL;! h  @" y6 H; u0 c
$ V3 {# R: H( U. ^/ [: k9 `
        if((fd = open("/dev/mem", O_RDWR)) <0)
6 f' O2 Q9 H5 @' f' {        {
6 ?; X( v1 x9 Q$ O9 r/ r0 r, c                perror("open error");
; A) }+ ?( n: X6 _! v2 ^8 s+ n                return -1;
* Q7 n) P2 ^  V1 Q$ N& G+ G1 Z2 x, a        }
! V% z5 {- n, Z        8 z& Z& w' d" k  Q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# |6 a3 y1 |) E' X& P: g

. p& f/ K1 {! v( k        while(1); d8 U3 |' J7 u' S, ^' ^; `
        {8 A7 N  I2 H& t3 f) o
                read_MSG_buffer(mem);
6 b; Y& e4 ?  m        }               
# \  V& |0 R- l# E! @}1 N9 n& V7 p% p% o* C
' h, D  p4 U3 C6 W
void read_MSG_buffer(int *baseaddr)0 f/ Q7 l, X* E+ I! G
{
! S0 G& |5 [5 s) i" E; j% L        pRX_MSG_PROTOCOL pshreRAM = NULL;: h, S9 P8 h/ n
& P; m6 N, f5 c- A: T2 N
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* U& h: Q" b2 f0 Y( @
$ \# O" A1 B/ {1 D        if(pshreRAM->packet_cout != count_copy)- s3 v8 t/ M8 C- d% U
        {
' Z, s' K* T% @8 h/ V                printf("a is %d\n", pshreRAM->a);8 t6 f2 l; s% f4 e2 ?
                printf("b is %d\n", pshreRAM->b);6 @- s2 x4 a5 B4 e& g( c5 j
                printf("count is %d\n", pshreRAM->packet_cout);7 @8 J& ~2 n9 A' u/ ]
                count_copy = pshreRAM->packet_cout;- P" ~/ }' L' A
        }% F0 b* }" f$ Y( J0 J) L- S. D
        else: F" [( \: L* j+ F4 h- `. N! d! X9 e
        {8 V' K, T9 I. L. h# W
                printf("No effective message!\n");
5 G7 d% C5 j, x# w3 b        }
8 R& W' f% Y3 U/ U5 k}
+ A; f; m* p: O# ?1 }% i7 w
  f! J: s( p$ q- N0 j! N没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) A# |6 R& _# q; F- O' W- m7 v* r
% x6 K9 J9 S  Z$ m- W

9 c9 Q& K) b" x+ S6 [/ d3 s2 j/ @
2 Q8 q# R, `% m% O8 Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-29 14:16 , Processed in 0.049600 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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